Я новичок в React-сцене и примерно через неделю поисков решений и руководств не смог решить эту проблему.
У меня следующая структура с Ожидаемые результаты:
Я следил за этим руководством: https://reacttraining.com/react-router/web/example/basic, за исключением использования параметров "match" на данный момент b / c, кажется, я неправильно использую их в codeandbox, в котором я тоже новичок.
Фактические результаты
При нажатии на первую ссылку «Список пользователей» отображается точный список, но также отображается компонент «UserDashboard» под списком.
При нажатии на одну из пользовательских ссылок URL-адрес обновляется, но вы попадаете на пустую страницу.
Код как для index.js:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Route, Switch, Link } from "react-router-
dom";
import Users from "./Users";
import UserDashboard from "./UserDashboard";
import "./styles.css";
function App() {
return (
<Router>
<div className = "App">
<ul>
<li>
<Link to = "/users/">Users List</Link>
</li>
</ul>
<Switch>
<Route exact path = "/users/" component = {Users} />
</Switch>
</div>
</Router>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Users.js
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Route, Switch, Link } from "react-router-
dom";
import UserDashboard from "./UserDashboard";
function Users({ match }) {
return (
<div>
<ul>
<li>
<Link to = "/1">John Smith</Link>
</li>
<li>
<Link to = "/2">Alex Rogers</Link>
</li>
<li>
<Link to = "/3">Ignacio Don</Link>
</li>
</ul>
<Route path = "/:id" component = {UserDashboard} />
</div>
);
}
export default Users;
UserDashboard.js
import React from "react";
import ReactDOM from "react-dom";
function UserDashboard({ match }) {
return (
<div>
<h3>Route Test</h3>
<h3>{match.params.topicId}</h3>
</div>
);
}
export default UserDashboard;
Идея, конечно же, состоит в том, чтобы производить все это с реальными данными с использованием graphQL, но пока я не исправлю эту (вероятно, очевидную) проблему, я не могу продолжить.
Ссылка на демонстрационную версию кода выше:





В index.js я изменил пару строк,
<Link to = "/users">Users List</Link>
и
<Route path = "/users" component = {Users} />
Выделение точного маршрута и удаление косых черт в конце пользователей.
В Users.js я изменил ваши ссылки и маршруты, чтобы они были похожи на пример обучения реакции.
<Link to = {`${match.url}/1`}>John Smith</Link>
<Route path = {`${match.path}/:id`} component = {UserDashboard} />
А в UserDashboard.js я изменил
<h3>{match.params.topicId}</h3>
к
<h3>{match.params.id}</h3>
Я думаю, что произошло то, что маршрутизатор соответствовал / users в вашем операторе switch из-за свойства точный. Я надеюсь, что это именно то поведение, которое вы искали.
Редактировать
Чтобы компоненты отключились при нажатии на перемещение пользователя
<Route path='/users/:id' component = {UserDashboard} />
От Users.js до index.js внутри компонента Switch и ниже
<Route exact path = "/users" component = {Users} />
Обратите внимание, что точный вернулся в маршрут / users. Это обеспечит соответствие маршрута / users.
Итак, вы хотите, чтобы UserDashboard заменял UserList, когда вы щелкаете по отдельному пользователю?
Да, все, я отредактирую свой вопрос, чтобы было понятнее.
Отредактировал ответ. Я думаю, это должно дать вам правильное поведение сейчас.
Да, это исправлено. Мой код начинался так на прошлой неделе, я делал так много обходных путей, пытаясь разобраться в этом, я не могу точно сказать, в чем заключалась исходная проблема, но готов поспорить, что это были косые черты.
Близко, то, что мне остается, это ссылка «Список пользователей», а также сам список пользователей, а затем компонент «UserDashboard», отображаемый под ним вместо «новой» страницы с визуализированным компонентом информационной панели. Некоторые из этих исправлений определенно продвинули меня вперед. Обновленная версия: codeandbox.io/embed/oxx1v2ylyq