【问题标题】:How exactly do you use React-Router-Dom?你究竟是如何使用 React-Router-Dom 的?
【发布时间】:2020-03-12 03:53:53
【问题描述】:

我正在尝试使用react-router-dom,但我遇到了困难,即使花了将近 1 个小时。

我已经检查了 reacttraining 的文档,但我很惭愧地说我仍然没有掌握这个概念。

其中一个令人困惑的方面是存在BrowserRouterRouteLinkSwitch。这么多,每个人都做什么?另外,您必须在Route 中包装一些代码,在Switch 中包装一些其他代码等等。一切都那么混乱。

这是我已有的代码:

import React, { useState } from "react";
import "./styles.css";
import AddPlayer from "./Components/AddPlayer";
import DisplayPlayers from "./Components/DisplayPlayers";
import EditPlayer from "./Components/EditPlayer";
import FilteredPlayers from "./Components/FilteredPlayers";

const App = () => {
  const [showAll, setShowAll] = useState(true);
  const [filteredText, setFilteredText] = useState("");
  const [editing, setEditing] = useState(false);
  const [playerToEdit, setPlayerToEdit] = useState();
  const [players, setPlayers] = useState([
    { id: 1, name: "Cristiano Ronaldo", club: "Juventus", important: true },
    { id: 2, name: "Lionel Messi", club: "Barcelona", important: false },
    { id: 3, name: "Kaka", club: "AC Milan", important: true },
    { id: 4, name: "Ronaldinho", club: "Barcelona", important: true },
    { id: 5, name: "Deco", club: "Barcelona", important: false },
    { id: 6, name: "Sergio Aguero", club: "Manchester City", important: false },
    { id: 7, name: "Frank Lampard", club: "Chelsea", important: true },
    {
      id: 8,
      name: "Son Heung Min",
      club: "Tottenham Hotspur",
      important: true
    },
    {
      id: 9,
      name: "Michael Carrick",
      club: "Manchester United",
      important: false
    },
    { id: 10, name: "Paolo Dybala", club: "Juventus", important: false }
  ]);

  const addPlayer = obj => {
    obj.id = players.length + 1;
    const temp = [...players, obj];
    setPlayers(temp);
  };

  const deletePlayer = id => {
    let i = 0;
    const temp = [...players];

    temp.forEach((el, a) => {
      if (el.id === id) i = a;
    });

    temp.splice(i, 1);
    setPlayers(temp);
  };

  const whichPlayer = obj => {
    setEditing(true);
    setPlayerToEdit(obj);
  };

  const editPlayer = (id, obj) => {
    const temp = [...players];
    setPlayers(temp.map(player => (player.id === id ? obj : player)));
    setEditing(false);
  };

  const toggle = id => {
    let i = 0;
    const temp = [...players];

    temp.forEach((el, a) => {
      if (el.id === id) i = a;
    });

    temp[i].important = !temp[i].important;
    setPlayers(temp);
  };

  let toShow = showAll ? players : players.filter(player => player.important);

  return (
    <div className="App">
      <header>Soccer database</header>
      <h2>Filter by name</h2>
      <input
        placeholder="Filter by name"
        onChange={e => setFilteredText(e.target.value)}
        value={filteredText}
      />
      <button onClick={() => setFilteredText("")}>Clear filter</button>
      {editing ? (
        <EditPlayer
          editPlayer={editPlayer}
          setEditing={setEditing}
          playerToEdit={playerToEdit}
          setFilteredText={setFilteredText}
        />
      ) : (
        <AddPlayer addPlayer={addPlayer} />
      )}
      {filteredText.length > 0 ? (
        <FilteredPlayers
          toShow={toShow}
          filteredText={filteredText}
          whichPlayer={whichPlayer}
          deletePlayer={deletePlayer}
          setShowAll={setShowAll}
          showAll={showAll}
          toggle={toggle}
        />
      ) : (
        <DisplayPlayers
          whichPlayer={whichPlayer}
          deletePlayer={deletePlayer}
          toShow={toShow}
          setShowAll={setShowAll}
          showAll={showAll}
          toggle={toggle}
        />
      )}
    </div>
  );
};

export default App;

如您所见,App 的返回部分已经很拥挤,我应该如何以及将所有react-router 的东西放在哪里?基本上,我的应用程序所做的是显示一个表格,每一行代表每个足球运动员。我希望能够单击一个名称,然后转到一个单独的组件,该组件显示有关该特定玩家的更多信息。如果您需要其余代码来帮助我,请告诉我。

感谢大家的宝贵时间!

【问题讨论】:

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


    【解决方案1】:

    请参阅.. 避免使用不必要的状态变量和新组件.. 我们实际上不需要在任何地方存储任何内容。它只会让你的代码变得混乱。

    https://codesandbox.io/s/react-routing-rcef9

    现在来到 react-router。我认为文档非常详尽。再给自己一次尝试。你应该没事。

    https://reacttraining.com/react-router/

    【讨论】:

    • 对不起,我忘了说我是初级水平,我不太明白你的代码。请问为什么我的状态是不必要的?
    • 对不起..我不是故意的..我的意思是,我们可以用更少的组件和变量来做到这一点。
    • 还有..请告诉我..具体是哪一个,你想让我解释一下。
    • 我想保留我当前的代码,但能够点击,例如,克里斯蒂亚诺罗纳尔多,并带来一个与你的完全相同的新组件 - 克里斯蒂亚诺罗纳尔多在顶部,尤文图斯在顶部底部。这就是我想要的。我只是不知道在哪里包装
    • 那么......你最好分享你的整个代码......包括所有组件......怎么样codesandbox.io/s/new
    【解决方案2】:

    react-router-dom 是有史以来最简单的。您不需要使用任何 if 条件。

    这个包中的父级是&lt;BrowserRouter&gt; 在这个里面我们提到我们的路线是这样的-->>

    import { BrowserRouter, Route } from "react-router-dom";
        <BrowserRouter>
                <Route exact path='/' component={Home} />
        </BrowserRouter>
    

    但是,如果用户输入了错误的 url 怎么办?显然它会抛出错误并且你的应用程序崩溃了。所以你需要把条件放在路线上。尽管如此,您仍然可以使用Switch,如下所示 ->>

    import { BrowserRouter, Route, Switch } from "react-router-dom";
       <BrowserRouter>
            <Switch>
                <Route exact path='/' component={Home} />
                <Route component={NotFound} />
            </Switch>
        </BrowserRouter>
    

    在名为NotFound 的组件中,你可以有这样的代码 ->>

    import { Link } from "react-router-dom";
    
    const NotFound = () => (
        <div className='NotFound' >
            <h3> Sorry, page not found!</h3>
            <Link to='/'> Back to home </Link>
        </div>
    )
    

    【讨论】:

    • 在这段代码中,您可以看到来自react-router-dom的所有导入对象的示例,即BrowserRouter、Route、Switch和Link。
    【解决方案3】:

    好的..所以我已经设法根据您的需要实施路由。我做了一些改动,尽可能做到最好。

    我还修复了一些控制台错误。

    详细解释即将推出。

    编辑:

    1. 首先我附上了根组件(即&lt;App /&gt;
      <BrowserRouter> <App /> </BrowserRouter>
    2. 然后我添加了一个新组件(&lt;PlayerDetails player /&gt;) 将播放器作为参数并渲染它。
    3. 在ViewPlayer和FilterPlayer组件中,我绑定了onclick事件 到表中的名称列。
      &lt;td style={style} onClick={() =&gt; history.push("/" + player.id)}&gt;
    4. 现在我可以在这里使用一些路线,但我没有使用任何路线。因为它是 这里不需要。因为我们只渲染一个组件,只是 在 URL 中带有条件 playerId。

      所以我在这里从 URL 中获取 playerId(如果存在)。
      const { pathname } = useLocation(); const playerId = pathname.replace("/", "");

    5. 如果 playerId 显示在 URL 中,我正在渲染 PlayerDetails 组件,否则 将呈现常规 App 组件。

      希望我能解释一下。如果您有任何疑问,请告诉我。

    https://codesandbox.io/s/crud-players-11hdi

    【讨论】:

    • 谢谢巴伦,感谢您的帮助。我发现了另一种对我来说更容易理解的方式,因为我的水平是初级的。但再次感谢您的帮助
    猜你喜欢
    • 2012-08-08
    • 2015-06-27
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多