Risposte:
Quando includi un componente della pagina principale nella tua app, è spesso racchiuso in un <Route>
componente come questo:
<Route path="/movies" component={MoviesIndex} />
In questo modo, il MoviesIndex
componente ha accesso a in this.props.history
modo da poter reindirizzare l'utente con this.props.history.push
.
Alcuni componenti (comunemente un componente di intestazione) vengono visualizzati su ogni pagina, quindi non sono racchiusi in <Route>
:
render() {
return (<Header />);
}
Ciò significa che l'intestazione non può reindirizzare l'utente.
Per aggirare questo problema, il componente header può essere racchiuso in una withRouter
funzione, sia quando viene esportato:
export default withRouter(Header)
Ciò fornisce l' Header
accesso al componente this.props.history
, il che significa che l'intestazione può ora reindirizzare l'utente.
history
o match
non sono presenti di default? cioè perché withRouter
dovrebbe essere menzionato esplicitamente?
withRouter
è un componente di ordine superiore che passerà la route match
, la corrente location
e gli history
oggetti di scena più vicini al componente avvolto ogni volta che viene eseguito il rendering. semplicemente collega il componente al router.
Non tutti i componenti, specialmente i componenti condivisi, avranno accesso agli oggetti di scena di tale router. All'interno dei suoi componenti avvolti, sarai in grado di accedere a location
prop e ottenere più informazioni come location.pathname
o reindirizzare l'utente a un URL diverso utilizzando this.props.history.push
.
Ecco un esempio completo dalla loro pagina 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);
Maggiori informazioni possono essere trovate qui .
withRouter
Il componente di ordine superiore ti consente di accedere alle history
proprietà dell'oggetto e alla corrispondenza più vicina <Route>
. withRouter
passerà gli oggetti di scena aggiornati match
, location
e history
al componente avvolto ogni volta che viene eseguito il rendering.
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 è un componente di ordine superiore che passerà il percorso più vicino per ottenere l'accesso ad alcune proprietà per quanto riguarda la posizione e la corrispondenza dagli oggetti di scena è possibile accedervi solo se dai al componente la proprietà situata nel componente
<Route to="/app" component={helo} history ={history} />
e lo stesso la corrispondenza e la prosperità della posizione per poter cambiare la posizione e utilizzare this.props.history.push dovrebbe essere fornito per ogni proprietà del componente deve fornire, ma quando viene utilizzato WithRouter può essere accesso alla posizione e abbinare senza aggiungere la cronologia della proprietà. è possibile accedere alla direzione senza aggiungere la cronologia delle proprietà per ogni percorso.
withRouter
dà anche accesso amatch
elocation
. Sarebbe bello se la risposta accettata lo dicesse, poiché il reindirizzamento dell'utente non è l'unico caso d'uso perwithRouter
. Questo è un bel self-qna altrimenti.