Estoy trabajando en una aplicación de reacción usando react-router. Tengo una página de proyecto que tiene una URL de la siguiente manera:
myapplication.com/project/unique-project-id
Cuando se carga el componente del proyecto, activo una solicitud de datos para ese proyecto desde el evento componentDidMount. Ahora me encuentro con un problema en el que si cambio directamente entre dos proyectos, solo la identificación cambia así ...
myapplication.com/project/982378632
myapplication.com/project/782387223
myapplication.com/project/198731289
componentDidMount no se activa de nuevo, por lo que los datos no se actualizan. ¿Hay algún otro evento del ciclo de vida que deba utilizar para activar mi solicitud de datos o una estrategia diferente para abordar este problema?
reactjs
react-router
Constelaciones
fuente
fuente
Respuestas:
Si el enlace se dirige a la misma ruta con solo un parámetro diferente, no se está volviendo a montar, sino que recibe nuevos accesorios. Entonces, podría usar la
componentWillReceiveProps(newProps)
función y buscarnewProps.params.projectId
.Si está intentando cargar datos, le recomendaría obtener los datos antes de que el enrutador maneje la coincidencia utilizando métodos estáticos en el componente. Mira este ejemplo. React Router Mega Demo . De esa manera, el componente cargaría los datos y se actualizaría automáticamente cuando cambiaran los parámetros de ruta sin necesidad de depender de ellos
componentWillReceiveProps
.fuente
state
. Es un poco confuso al principio, pero luego se vuelve un poco más claro.Si necesita volver a montar un componente cuando cambia la ruta, puede pasar una clave única al atributo de clave de su componente (la clave está asociada con su ruta / ruta). Entonces, cada vez que cambia la ruta, la clave también cambiará, lo que activa el componente React para desmontar / volver a montar. Tengo la idea de esta respuesta
fuente
Aquí está mi respuesta, similar a algunas de las anteriores pero con código.
fuente
Tienes que tener claro que un cambio de ruta no provocará una actualización de página, tienes que manejarlo tú mismo.
fuente
Si usted tiene:
En React 16.8 y superior, usando ganchos , puede hacer:
Allí, solo está activando una nueva
fetchResource
llamada cada vez queprops.match.params.id
cambia.fuente
componentWillReceiveProps
Basado en las respuestas de @wei, @ Breakpoint25 y @PaulusLimma, hice este componente de reemplazo para
<Route>
. Esto volverá a montar la página cuando cambie la URL, lo que obligará a que todos los componentes de la página se creen y monten de nuevo, no solo que se vuelvan a representar. TodoscomponentDidMount()
y todos los demás enlaces de inicio se ejecutan también en el cambio de URL.La idea es cambiar la
key
propiedad de los componentes cuando cambia la URL y esto obliga a React a volver a montar el componente.Puede usarlo como un reemplazo directo para
<Route>
, por ejemplo, esto:El
<RemountingRoute>
componente se define así:Esto ha sido probado con React-Router 4.3.
fuente
La respuesta de @ wei funciona muy bien, pero en algunas situaciones me parece mejor no establecer una clave del componente interno, sino la ruta en sí. Además, si la ruta al componente es estática, pero solo desea que el componente se vuelva a montar cada vez que el usuario navegue hacia él (tal vez para hacer una llamada de API en componentDidMount ()), es útil establecer location.pathname en la clave de la ruta. Con su ruta y todo su contenido se vuelve a montar cuando cambia la ubicación.
fuente
Así es como resolví el problema:
Este método obtiene el elemento individual de la API:
Llamo a este método desde componentDidMount, este método se llamará solo una vez, cuando cargue esta ruta por primera vez:
Y desde componentWillReceiveProps que se llamará desde la segunda vez que cargamos la misma ruta pero diferente ID, y llamo al primer método para recargar el estado y luego el componente cargará el nuevo elemento.
fuente
Si está usando Class Component, puede usar componentDidUpdate
fuente
Puede utilizar el método proporcionado:
cuando se garantiza que el componente volverá a renderizarse después del cambio de ruta, puede pasar los accesorios como dependencia
No es la mejor manera, pero es lo suficientemente buena para manejar lo que está buscando según Kent C. Dodds : Considere más lo que desea que haya sucedido.
fuente
react-router
está roto porque debe volver a montar componentes en cualquier cambio de ubicación.Sin embargo, logré encontrar una solución para este error:
https://github.com/ReactTraining/react-router/issues/1982#issuecomment-275346314
En resumen (consulte el enlace de arriba para obtener información completa)
Esto hará que se vuelva a montar en cualquier cambio de URL.
fuente