J'ai quelques boutons qui agissent comme des itinéraires. Chaque fois que l'itinéraire est modifié, je veux m'assurer que le bouton actif change.
Existe-t-il un moyen d'écouter les changements d'itinéraire dans React Router v4?
react-router-v4
Kasper
la source
la source
Réponses:
J'utilise
withRouter
pour obtenir l'location
accessoire. Lorsque le composant est mis à jour en raison d'un nouvel itinéraire, je vérifie si la valeur a changé:J'espère que ça aide
la source
withRouter
j'utilise, mais j'obtiens une erreurYou should not use <Route> or withRouter() outside a <Router>
. Je ne vois aucun<Router/>
composant dans le code ci-dessus. Alors, comment ça marche?<Switch>
composant agit en tant que routeur de facto. Seule la première<Route>
entrée à avoir un chemin correspondant sera rendue. Aucun<Router/>
composant n'est nécessaire dans ce scénarioPour développer ce qui précède, vous devrez accéder à l'objet historique. Si vous utilisez
BrowserRouter
, vous pouvez importerwithRouter
et envelopper votre composant avec un composant d'ordre supérieur (HoC) afin d'avoir accès via des accessoires aux propriétés et fonctions de l'objet historique.La seule chose à savoir est que withRouter et la plupart des autres moyens d'accéder au
history
semblent polluer les accessoires lorsqu'ils déstructurent l'objet en lui.la source
withRoutes
vouswithRouter
.history
plutôt que la variablelisten
.Vous devez utiliser history v4 lib.
Exemple à partir de là
la source
history.push
cela déclenchehistory.listen
. Consultez l'exemple Utilisation d'une URL de base dans la documentation de l' historique v4 . Comme ilhistory
s'agit en fait d'un wrapper de l'history
objet natif d'un navigateur, il ne se comporte pas exactement comme l'objet natif.const unlisten = history.listen(myListener); unlisten();
withRouter
,history.listen
EtuseEffect
(React crochets) fonctionne très bien ensemble:Le rappel de l'écouteur se déclenchera chaque fois qu'une route est modifiée, et le retour pour
history.listen
est un gestionnaire d'arrêt qui joue bien avecuseEffect
.la source
v5.1 introduit le hook utile
useLocation
https://reacttraining.com/blog/react-router-v5-1/#uselocation
la source
Cannot read property 'location' of undefined at useLocation
. Vous devez vous assurer que l'appel useLocation () n'est pas dans le même composant qui met le routeur dans l'arborescence: voir iciAvec crochets:
Importer et rendre en tant que
<DebugHistory>
composantla source
avec crochets
la source
la source
Avec React Hooks, j'utilise
useEffect
la source
Dans certains cas, vous pouvez utiliser l'
render
attribut au lieu decomponent
, de cette manière:Notez que si vous changez l'état de la
onRouteChange
méthode, cela peut provoquer l'erreur «Profondeur de mise à jour maximale dépassée».la source
Avec le
useEffect
hook, il est possible de détecter les changements d'itinéraire sans ajouter d'écouteur.la source
Je viens de traiter ce problème, je vais donc ajouter ma solution en complément des autres réponses données.
Le problème ici est que
useEffect
cela ne fonctionne pas vraiment comme vous le souhaiteriez, car l'appel n'est déclenché qu'après le premier rendu, il y a donc un délai indésirable.Si vous utilisez un gestionnaire d'état comme redux, il y a de fortes chances que vous obteniez un scintillement à l'écran en raison d'un état persistant dans le magasin.
Ce que vous voulez vraiment, c'est utiliser
useLayoutEffect
car cela se déclenche immédiatement.J'ai donc écrit une petite fonction utilitaire que j'ai placée dans le même répertoire que mon routeur:
Ce que j'appelle depuis le composant HOC comme ceci:
path
est l'accessoire qui est passé dans l'match
objet lors de l'utilisationwithRouter
.Je ne suis pas vraiment en faveur de l'écoute / désécoute manuelle de l'histoire. C'est juste imo.
la source