vuejs vue usar rutas link hijas vue.js vuejs2 vue-router vuex

vue.js - usar - Acceder al estado de Vuex al definir las rutas de Vue-Router



vue router set (2)

Como se sugiere aquí , lo que puede hacer es exportar su tienda desde el archivo en el que está e importarla en routes.js . Será algo así como lo siguiente:

Usted tiene un store.js :

import Vuex from ''vuex'' //init store const store = new Vuex.Store({ state: { globalError: '''', user: { authenticated: false } }, mutations: { setGlobalError (state, error) { state.globalError = error } } }) export default store

Ahora en routes.js , puedes tener:

import Vue from ''vue'' import VueRouter from ''vue-router'' import store from ./store.js Vue.use(VueRouter) //define routes const routes = [ { path: ''/home'', name: ''Home'', component: Home }, { path: ''/login'', name: ''Login'', component: Login }, { path: ''/secret'', name: ''Secret'', component: SecretPage, meta: { requiresLogin: true } ] Router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresLogin) && ???) { // You can use store variable here to access globalError or commit mutation next("/Login") } else { next() } })

En main.js también puedes importar la store :

import Vue from ''vue'' import Vuex from ''vuex'' Vue.use(Vuex) import store from ''./store.js'' //init app const app = new Vue({ router: Router, store, template: ''<app></app>'', components: { App } }).$mount(''#app'')

Tengo la siguiente tienda Vuex (main.js):

import Vue from ''vue'' import Vuex from ''vuex'' Vue.use(Vuex) //init store const store = new Vuex.Store({ state: { globalError: '''', user: { authenticated: false } }, mutations: { setGlobalError (state, error) { state.globalError = error } } }) //init app const app = new Vue({ router: Router, store, template: ''<app></app>'', components: { App } }).$mount(''#app'')

También tengo las siguientes rutas definidas para Vue-Router (routes.js):

import Vue from ''vue'' import VueRouter from ''vue-router'' Vue.use(VueRouter) //define routes const routes = [ { path: ''/home'', name: ''Home'', component: Home }, { path: ''/login'', name: ''Login'', component: Login }, { path: ''/secret'', name: ''Secret'', component: SecretPage, meta: { requiresLogin: true } ]

Estoy tratando de hacerlo de modo que si el objeto de user la tienda Vuex tiene la propiedad authenticated falsa, haga que el enrutador redirija al usuario a la página de inicio de sesión.

Tengo esto:

Router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresLogin) && ???) { // set Vuex state''s globalError, then redirect next("/Login") } else { next() } })

El problema es que no sé cómo acceder al objeto de user la tienda Vuex desde el interior de la función beforeEach.

Sé que puedo tener la lógica de protección del enrutador dentro de los componentes usando BeforeRouteEnter , pero eso BeforeRouteEnter cada componente. Quiero definirlo centralmente en el nivel del enrutador.


Terminé moviendo la tienda de main.js a store / index.js, e importándola al archivo router.js:

import store from ''./store'' //routes const routes = [ { path: ''/home'', name: ''Home'', component: Home }, { path: ''/login'', name: ''Login'', component: Login }, { path: ''/secret'', name: ''Secret'', component: SecretPage, meta: { requiresLogin: true } ] //guard clause Router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresLogin) && store.state.user.authenticated == false) { store.commit("setGlobalError", "You need to log in before you can perform this action.") next("/Login") } else { next() } })