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
withRouterpara obtener ellocationaccesorio. 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 importarwithRoutery 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
historyparecen contaminar los accesorios a medida que desestructuran el objeto en él.fuente
withRoutesawithRouter.historylugar de la variablelisten.Debes usar history v4 lib.
Ejemplo a partir de ahí
fuente
history.pushsí se disparahistory.listen. Consulte el ejemplo Uso de una URL base en los documentos de la historia v4 . Debido a que enhistoryrealidad es un contenedor delhistoryobjeto nativo de un navegador, no se comporta exactamente como el nativo.const unlisten = history.listen(myListener); unlisten();withRouter,history.listenyuseEffect(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.listenes un controlador de apagado que funciona bien conuseEffect.fuente
v5.1 presenta el útil gancho
useLocationhttps://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
useEffectfuente
En algunos casos, puede usar el
renderatributo en lugar decomponent, de esta manera:Tenga en cuenta que si cambia el estado del
onRouteChangemétodo, esto podría causar el error 'Profundidad máxima de actualización excedida'.fuente
Con el
useEffectenlace 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
useEffectrealmente 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,
useLayoutEffectya 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:
pathes el accesorio que se pasa en elmatchobjeto cuando se usawithRouter.No estoy realmente a favor de escuchar / no escuchar manualmente en la historia. Eso es solo imo.
fuente