#javascript #reactjs #react-router
#javascript #reactjs #react-маршрутизатор
Вопрос:
js и сталкивается с трудностями с react router dom. Я хочу изменить маршрут, когда нажимаю кнопку в своем компоненте панели навигации.
Это мой App.js компонент.
import { Router, Route, Switch } from "react-router-dom";
function App() {
const classes = useStyles();
return (
<Provider store={store}>
<div className={classes.root}>
<NavBar />
<Drawer />
<Router history={history}>
<Switch>
<Route path="/" exact component={Login}></Route>
<Route path="/country" exact component={Country}></Route>
<Route path="/user-create" exact component={User}></Route>
<Route path="/countries" exact component={ListView}></Route>
<Route component={NotFound}></Route>
</Switch>
</Router>
</div>
</Provider>
);
}
И здесь я передаю history prop компоненту маршрутизатора.
History.js
import { createBrowserHistory } from 'history';
export default createBrowserHistory();
Drawer.js
import history from '../../history'
const onRoute = (path) => {
history.push("/user-create");
// props.toggleDrawer();
}
В Drawer.js это всегда маршрут к NotFoundComponet.
Почему это могло произойти?
Комментарии:
1. Попробуйте обернуть свой компонент Drawer внутри маршрутизатора!
2. @DILEEPTHOMAS Вы имеете в виду создать новый маршрут для ящика?
3. @ Pathum, нет, просто переместите маршрутизатор над компонентом ящика, оберните компонент ящика также маршрутизатором, попробуйте
4. Все кажется правильным. Вы действительно делаете
history.push("/user-create");
илиhistory.push(path);
?NotFoundComponet
будет отображаться, когдаpath
принимает значение, отличное от —/
,/country
,/user-create
или/countries
.5. Можете ли вы опубликовать минимальный, воспроизводимый пример?
Ответ №1:
В ваших компонентах NavBar и Drawer включите приведенный ниже withRouter или хук alt useHistory, чтобы получить доступ к реквизиту истории.
import { withRouter } from 'react-router'
...
this.props.history.push('/user-create')
...
export default withRouter(...
Комментарии:
1. В этом нет необходимости
withRouter
, OP импортируетhistory
объект вDrawer
компоненте.2. @Yousaf Это работает, и я импортирую {BrowserRouter как маршрутизатор}. Я думаю, что с этим все работает.
3. @PathumKalhan это работает, потому что вместо использования
history
объекта, импортированного явно, вы используетеhistory
объект, переданный в качестве реквизита из-заwithRouter
компонента более высокого порядка, НО импортhistory
объекта, как вы находитесь вDrawer
компоненте, также должен работать.
Ответ №2:
Я бы поместил <NavBar />
и <Drawer />
внутрь <Router>
и сделал
const { push } = useHistory() // from react-router-dom
внутри них, чтобы получить ссылку на push
API