Kiedy umieszczasz w aplikacji komponent strony głównej, często jest on opakowany w taki <Route>
komponent:
<Route path="/movies" component={MoviesIndex} />
W ten sposób MoviesIndex
komponent ma dostęp do, this.props.history
aby mógł przekierować użytkownika za pomocąthis.props.history.push
.
Niektóre komponenty (zwykle komponent nagłówka) pojawiają się na każdej stronie, więc nie są opakowane w <Route>
:
render() {
return (<Header />);
}
Oznacza to, że nagłówek nie może przekierować użytkownika.
Aby obejść ten problem, komponent nagłówka można opakować w withRouter
funkcję, gdy jest eksportowany:
export default withRouter(Header)
Daje to Header
dostęp do komponentu this.props.history
, co oznacza, że nagłówek może teraz przekierować użytkownika.
withRouter
daje również dostęp domatch
ilocation
. Byłoby miło, gdyby w akceptowanej odpowiedzi wspomniano o tym, ponieważ przekierowanie użytkownika nie jest jedynym przypadkiem użyciawithRouter
. Inaczej jest to fajna samo-qna.history
lubmatch
nie? tj. dlaczegowithRouter
należy wyraźnie wspomnieć?withRouter
jest komponentem wyższego rzędu, który przekaże najbliższą trasęmatch
, bieżącąlocation
ihistory
właściwości do opakowanego komponentu podczas renderowania. po prostu łączy komponent z routerem.Nie wszystkie komponenty, zwłaszcza komponenty współdzielone, będą miały dostęp do właściwości routera. Wewnątrz jego opakowanych komponentów byłbyś w stanie uzyskać dostęp do
location
właściwości i uzyskać więcej informacji, takich jaklocation.pathname
lub przekierować użytkownika do innego adresu URL za pomocąthis.props.history.push
.Oto pełny przykład z ich strony 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);
Więcej informacji można znaleźć tutaj .
źródło
withRouter
komponent wyższego rzędu pozwala uzyskać dostęp dohistory
właściwości obiektu i najbliższego<Route>
dopasowania.withRouter
przekaże zaktualizowanematch
,location
ihistory
props do opakowanego komponentu za każdym razem, gdy będzie renderowany.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);
źródło
withRouter jest komponentem wyższego rzędu, który przejdzie najbliższą trasę, aby uzyskać dostęp do pewnej właściwości co do lokalizacji i dopasowania z właściwości, do których można uzyskać dostęp tylko wtedy, gdy nadasz komponentowi właściwość znajdującą się w komponencie
<Route to="/app" component={helo} history ={history} />
i to samo dopasowanie i dobrobyt lokalizacji, aby móc zmienić lokalizację i użyć this.props.history.push, należy to zapewnić dla każdej właściwości komponentu, którą musi zapewnić, ale gdy jest używany WithRouter może być dostęp do lokalizacji i dopasować bez dodawania historii właściwości. można uzyskać dostęp do kierunku bez dodawania historii właściwości dla każdej trasy.
źródło