Tengo un par de botones que actúan como rutas. Cada vez que se cambia la ruta, quiero asegurarme de que el botón que está activo cambia.
¿Hay alguna manera de escuchar los cambios de ruta en react router v4?
react-router-v4
Kasper
fuente
fuente
Respuestas:
Yo uso
withRouter
para obtener ellocation
accesorio. Cuando el componente se actualiza debido a una nueva ruta, verifico si el valor cambió:Espero eso ayude
fuente
withRouter
, pero recibo un errorYou should not use <Route> or withRouter() outside a <Router>
. No veo ningún<Router/>
componente en el código anterior. Entonces, ¿cómo está funcionando?<Switch>
componente está actuando como el enrutador de facto. Solo se representará la primera<Route>
entrada que tenga una ruta coincidente. No hay necesidad de ningún<Router/>
componente en este escenarioPara ampliar lo anterior, deberá acceder al objeto de historial. Si está utilizando
BrowserRouter
, puede importarwithRouter
y envolver su componente con un componente de orden superior (HoC) para tener acceso a través de accesorios a las propiedades y funciones del objeto de historial.Lo único que debe tener en cuenta es que con Router y la mayoría de las otras formas de acceder a él
history
parecen contaminar los accesorios a medida que desestructuran el objeto en él.fuente
withRoutes
awithRouter
.history
lugar de la variablelisten
.Debes usar history v4 lib.
Ejemplo a partir de ahí
fuente
history.push
sí se disparahistory.listen
. Consulte el ejemplo Uso de una URL base en los documentos de la historia v4 . Debido a que enhistory
realidad es un contenedor delhistory
objeto nativo de un navegador, no se comporta exactamente como el nativo.const unlisten = history.listen(myListener); unlisten();
withRouter
,history.listen
yuseEffect
(React Hooks) funcionan muy bien juntos:La devolución de llamada del oyente se activará cada vez que se cambie una ruta, y el retorno
history.listen
es un controlador de apagado que funciona bien conuseEffect
.fuente
v5.1 presenta el útil gancho
useLocation
https://reacttraining.com/blog/react-router-v5-1/#uselocation
fuente
Cannot read property 'location' of undefined at useLocation
. Debe asegurarse de que la llamada useLocation () no esté en el mismo componente que coloca el enrutador en el árbol: consulte aquíCon ganchos:
Importar y renderizar como
<DebugHistory>
componentefuente
con ganchos
fuente
fuente
Con reaccionar ganchos, estoy usando
useEffect
fuente
En algunos casos, puede usar el
render
atributo en lugar decomponent
, de esta manera:Tenga en cuenta que si cambia el estado del
onRouteChange
método, esto podría causar el error 'Profundidad máxima de actualización excedida'.fuente
Con el
useEffect
enlace es posible detectar cambios de ruta sin agregar un oyente.fuente
Acabo de resolver este problema, así que agregaré mi solución como suplemento a otras respuestas dadas.
El problema aquí es que
useEffect
realmente no funciona como desearía, ya que la llamada solo se activa después del primer renderizado, por lo que hay un retraso no deseado.Si utiliza algún administrador de estado como redux, es probable que obtenga un parpadeo en la pantalla debido al estado persistente en la tienda.
Lo que realmente quieres es usar,
useLayoutEffect
ya que esto se activa de inmediato.Entonces escribí una pequeña función de utilidad que puse en el mismo directorio que mi enrutador:
Lo que llamo desde dentro del componente HOC como este:
path
es el accesorio que se pasa en elmatch
objeto cuando se usawithRouter
.No estoy realmente a favor de escuchar / no escuchar manualmente en la historia. Eso es solo imo.
fuente