Tengo la siguiente secuencia sucediendo:
Pantalla principal
Cargando pantalla
Pantalla de resultados
En la página de inicio, cuando alguien hace clic en un botón, lo envío a la pantalla de carga, a través de:
this.$router.push({path: "/loading"});
Y una vez que finaliza su tarea, se envían a la pantalla de resultados a través de
this.$router.push({path: "/results/xxxx"});
El problema es que, por lo general, quieren volver de los resultados a la pantalla principal, pero cuando vuelven a hacer clic, se vuelven a cargar, lo que los devuelve a los resultados, por lo que están atrapados en un bucle infinito y no pueden ir de vuelta a la pantalla principal.
Alguna idea de cómo solucionar este problema? Idealmente me gustaría si hubiera una opción como:
this.$router.push({path: "/loading", addToHistory: false});
que los enviaría a la ruta sin agregarlo al historial.
fuente
this.$router.replace({path: "/results/xxxx"})
$router.replace
desde Loading. Esto ahora me permite volver de Resultados -> Principal, pero luego no puedo avanzar a los resultados.Respuestas:
Hay una manera perfecta de manejar esta situación.
Puede usar la protección en componentes para controlar la ruta en el nivel de gránulo
Realice los siguientes cambios en su código
En el componente de pantalla principal
En el componente de la pantalla de carga
En resultado componente de pantalla
Acabo de crear una pequeña aplicación vue para reproducir el mismo problema. Funciona en mi local según su pregunta. Espero que resuelva tu problema también.
fuente
Supongo que
router.replace
es el camino a seguir, pero aún algunas líneas de pensamiento (sin probar):Básicamente, en el
$router
cambio, representa el componente de carga hasta que emiteload:stop
, luego representa elrouter-view
fuente
Esta es una decisión difícil considerando lo poco que sabemos sobre lo que ocurre en su ruta de carga.
Pero...
Nunca he tenido la necesidad de construir una ruta de carga, solo cargando los componentes que se procesan en varias rutas durante la etapa de inicio / recopilación de datos.
Un argumento para no tener una ruta de carga sería que un usuario podría navegar directamente a esta URL (accidentalmente) y luego parece que no tendría suficiente contexto para saber dónde enviar al usuario o qué acción tomar. Aunque esto podría significar que cae en una ruta de error en este momento. En general, no fue una gran experiencia.
Otra es que si simplifica sus rutas, la navegación entre rutas se vuelve mucho más simple y se comporta como se esperaba / desea sin el uso de
$router.replace
.Entiendo que esto no resuelve la pregunta en la forma en que la preguntas. Pero sugeriría repensar esta ruta de carga.
App
Cáscara
Pagina principal
Página de resultados
Componente de resultados
Básicamente, el mismo componente de resultados exactos que ya tiene, pero si
loading
es verdadero o siresults
es nulo, como prefiera, puede crear un conjunto de datos falso para iterar y crear versiones de esqueleto, si lo desea. De lo contrario, puede mantener las cosas como las tiene.fuente
Otra opción es usar la API de historial .
Una vez que esté en la pantalla de Resultados, puede utilizar el Reemplazar Estado para reemplazar la URL en el historial del navegador.
fuente
Esto se puede hacer con el
beforeEach
gancho del enrutador.Lo que debe hacer es guardar una variable globalmente o en localStorage en el
loading
componente cuando se cargan los datos (antes de redirigir alresults
componente):Y luego debe verificar esta variable en el gancho beforeEach y saltar al componente correcto:
Además, recuerde restablecer el valor a falso en su
main
componente cuando se hace clic en el botón de consulta (antes de enrutar alloading
componente):fuente
Vue-router no debe controlar su pantalla de carga. La mejor opción es usar un modal / overlay para su pantalla de carga, controlado por javascript. Hay muchos ejemplos para vue. Si no puede encontrar nada, vue-bootstrap tiene algunos ejemplos fáciles de implementar.
fuente