Когда вы включаете компонент главной страницы в свое приложение, он часто упаковывается в такой <Route>
компонент:
<Route path="/movies" component={MoviesIndex} />
Таким образом, MoviesIndex
компонент получает доступ this.props.history
и может перенаправить пользователя с помощью this.props.history.push
.
Некоторые компоненты (обычно компонент заголовка) появляются на каждой странице, поэтому не заключены в <Route>
:
render() {
return (<Header />);
}
Это означает, что заголовок не может перенаправить пользователя.
Чтобы обойти эту проблему, компонент заголовка может быть заключен в withRouter
функцию при его экспорте:
export default withRouter(Header)
Это дает Header
компоненту доступ к this.props.history
, а это значит, что заголовок теперь может перенаправлять пользователя.
withRouter
также дает доступ кmatch
иlocation
. Было бы неплохо, если бы в принятом ответе упоминалось это, поскольку перенаправление пользователя - не единственный вариант использованияwithRouter
. В остальном это хорошая самооценка.history
илиmatch
нет по умолчанию? т.е. почемуwithRouter
следует упомянуть явно?withRouter
- это компонент более высокого порядка, который будет передавать ближайшие routematch
, currentlocation
иhistory
props обернутому компоненту при каждом рендеринге. просто подключает компонент к роутеру.Не все компоненты, особенно общие компоненты, будут иметь доступ к таким свойствам маршрутизатора. Внутри его обернутых компонентов вы сможете получить доступ к
location
опоре и получить дополнительную информацию, например,location.pathname
перенаправить пользователя на другой URL-адресthis.props.history.push
.Вот полный пример со страницы github:
import React from "react"; import PropTypes from "prop-types"; import { withRouter } from "react-router"; // A simple component that shows the pathname of the current location class ShowTheLocation extends React.Component { static propTypes = { match: PropTypes.object.isRequired, location: PropTypes.object.isRequired, history: PropTypes.object.isRequired }; render() { const { match, location, history } = this.props; return <div>You are now at {location.pathname}</div>; } } // Create a new component that is "connected" (to borrow redux // terminology) to the router. const ShowTheLocationWithRouter = withRouter(ShowTheLocation);
Более подробную информацию можно найти здесь .
источник
withRouter
Компонент более высокого порядка позволяет получить доступ кhistory
свойствам объекта и ближайшему<Route>
соответствию.withRouter
будет передавать обновленныеmatch
,location
иhistory
свойства обернутому компоненту при каждом рендеринге.import React from "react"; import PropTypes from "prop-types"; import { withRouter } from "react-router"; // A simple component that shows the pathname of the current location class ShowTheLocation extends React.Component { static propTypes = { match: PropTypes.object.isRequired, location: PropTypes.object.isRequired, history: PropTypes.object.isRequired }; render() { const { match, location, history } = this.props; return <div>You are now at {location.pathname}</div>; } } // Create a new component that is "connected" (to borrow redux // terminology) to the router. const ShowTheLocationWithRouter = withRouter(ShowTheLocation);
источник
withRouter - это компонент более высокого порядка, который будет передавать ближайший маршрут, чтобы получить доступ к некоторому свойству в отношении местоположения и совпадения с реквизитами, к нему можно получить доступ, только если дать компоненту свойство, расположенное в компоненте
<Route to="/app" component={helo} history ={history} />
и то же самое соответствие и процветание местоположения, чтобы иметь возможность изменить местоположение и использовать this.props.history.push, он должен быть предоставлен для каждого свойства компонента, которое должно обеспечивать, но при использовании WithRouter он может иметь доступ к местоположению и совпадению без добавления истории свойств. можно получить доступ к направлению без добавления истории свойств для каждого маршрута.
источник