【问题标题】:implementing Router to change pages in React.js在 React.js 中实现路由器以更改页面
【发布时间】:2021-03-31 18:20:02
【问题描述】:

我正在制作一个 react.js 购物清单应用程序,我有它,以便您输入值并将它们打印到表格中。这是我第一次使用 react,我想将我的表放在单独的页面上,我知道 ROUTER 方法,但在实现它时遇到了麻烦。

这是我的代码 注意:我还没有添加任何在页面之间导航的东西,但我希望打印按钮从 App.js 导航到 Details.js

import NavBar from "./components/navbar";
import "./App.css";
import Counters from "./components/counters";
import Details from "./Details";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";

class App extends Component {
  state = {
    counters: [
      //example of objects in array
      /*{ id: 1, value: 2, text: "hi" },*/
    ],
  };
  constructor(props) {
    super(props);
    console.log("app- constructor");
  }

  componentDidMount() {
    console.log("app- mouneted");
  }

  handleIncrement = (counter) => {
    const counters = [...this.state.counters];
    const index = counters.indexOf(counter);
    counters[index] = { ...counter };
    counters[index].value++;
    this.setState({ counters });
  };

  handleDecrement = (counter) => {
    const counters = [...this.state.counters];
    const index = counters.indexOf(counter);
    counters[index] = { ...counter };
    counters[index].value--;
    this.setState({ counters });
  };

  handleReset = () => {
    const counters = this.state.counters.map((c) => {
      c.value = 0;
      return c;
    });
    this.setState({ counters });
  };

  handleName = () => {
    var name = prompt("name");
    return name;
  };

  handleCreate = () => {
    const create = this.state.counters.length + 1;
    const counter = this.state.counters.push({
      id: create,
      value: 0,
      text: this.handleName(),
    });
    this.setState({ counter });
  };

  handleDelete = (counterId) => {
    const counters = this.state.counters.filter((c) => c.id !== counterId);
    this.setState({ counters });
  };

  handleInfo = () => {
    let x;
    //loops through all tems and adds the to the list
    for (x = 0; x <= this.state.counters.length; x++) {
      //breaks loop if x is == to counters array
      if (this.state.counters.length == x) {
        break;
      }
      const info = this.state.counters[x]["text"];
      const quantity = this.state.counters[x]["value"];
      console.log(info, quantity);

      //creates rows based on input
      var table = document.getElementById("myList");
      var row = table.insertRow(1);
      var itemCell = row.insertCell(0);
      var quantityCell = row.insertCell(1);
      itemCell.innerHTML = info;
      quantityCell.innerHTML = quantity;
    }
    //calls the print function
    return <a href="http://localhost:3000/Details"></a>;
  };

  render() {
    console.log("rendered");
    return (
      <React.Fragment>
        <NavBar
          totalCounters={this.state.counters.filter((c) => c.value > 0).length}
        />

        <main className="container">
          <Counters
            counters={this.state.counters}
            onReset={this.handleReset}
            onCreate={this.handleCreate}
            onIncrement={this.handleIncrement}
            onDecrement={this.handleDecrement}
            onDelete={this.handleDelete}
            onInfo={this.handleInfo}
          />
        </main>

        <div>
          <table bordered id="myList">
            <tr>
              <th>Items</th>
              <th>Quantity</th>
            </tr>
          </table>
        </div>
        <style>
          {`
          th{
            border: 2px solid black;
            padding: 2px;
            min-width: 100px;
            font-size: 22px;
            font-style: bold;
          }
          
          td{
            border: 2px solid black;
            padding: 2px;
            min-width: 100px;
            font-size: 18px;
          }

        
          `}
        </style>
      </React.Fragment>
    );
  }
}

export default App;

这就是我的应用程序的样子 但我希望表格位于详细信息页面上 任何帮助表示赞赏

【问题讨论】:

    标签: javascript reactjs react-router-dom react-router-redux


    【解决方案1】:

    Router 不是方法,而是包装应用程序的组件。在Router 内部,Switch 组件包装了Route 的几个实例,这些实例又包装了在该路由被命中时要渲染的组件。最后,Link 组件用于构建到各种Route 实例的链接。总而言之,它看起来像这样:

    import { 
        BrowserRouter as Router, 
        Switch, 
        Route,
        Link
    } from "react-router-dom";
    
    <Router>
        <Switch>
    
            <Route exact path="/">
                <div>
    
                    ...insert home page here...
    
                    <Link to="/details">Click here to go to details page!</Link>
    
                </div>
            </Route>
    
            <Route path="/details">
                ...details page/component here...
            </Route>
    
        </Switch>
    </Router>
    

    请参阅React Router Tutorial 了解更多信息。

    【讨论】:

    • 是否可以将其放入函数的返回中,还是不行?
    • 好的,我已经添加了,我确实有一个链接,它确实转到了我的 localhost:3000/Details ..... 但是它保留了同一页面的所有相同组件,尽管我没有任何内容我的 Details.js。有谁知道为什么
    • 是的,应该由渲染函数返回。如果在开关内但在Routes 之外有任何内容,则会在两个页面上呈现。如果这不是问题,请尝试将道具 exact 传递给 / 路由。我已经编辑了上面的示例以反映这一点。
    • 非常感谢您的工作。它比我想象的要复杂得多,在学习 react 之前,我用原生 JavaScript 完成了我所有的项目,并且更改页面要容易得多
    猜你喜欢
    • 2021-10-15
    • 2021-01-13
    • 2016-04-08
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多