Доступ к хранилищу в маршрутизаторе

#vue.js #vuex #quasar

#vue.js #vuex #квазар

Вопрос:

Я хотел бы проверить в моем хранилище Vuex, есть ли у пользователя 'admin' роль, прежде чем вводить /dashboard маршрут. Но я не могу правильно получить доступ к данным store.getters .

Я использую Quasar (Vue.js ) и Vuex Typescript.

В routes.ts файле, в beforeEnter() функции, я могу получить доступ к получателям из хранилища с помощью a console.log(store.myStore.getters) . Здесь я вижу userInfos внутри:

введите описание изображения здесь

Я не понимаю, почему я получаю только {} , а не {...} (обратите внимание, что если я нажму на него, я увижу его содержимое).

Но если я звоню console.log(store.myStore.getters.userInfos) , я не вижу данных:

введите описание изображения здесь

Вот index.ts (маршрутизатор):

 import { route } from 'quasar/wrappers'
import VueRouter from 'vue-router'
import { Store } from 'vuex'
import { StateInterface } from '../store'
import routes from './routes'

export default route<Store<StateInterface>>(function ({ Vue }) {
  Vue.use(VueRouter)

  const Router = new VueRouter({
    scrollBehavior: () => ({ x: 0, y: 0 }),
    routes,

    mode: process.env.VUE_ROUTER_MODE,
    base: process.env.VUE_ROUTER_BASE
  })

  return Router
})
 

Вот routes.ts (маршрутизатор):

 import { RouteConfig } from 'vue-router'

const routes: RouteConfig[] = [
  {
    path: '/',
    component: () => import('layouts/Login.vue'),
    children: [
      { path: '', component: () => import('pages/Index.vue') },
      { path: '/inscription', component: () => import('pages/SignUp.vue') },
      { path: '/connexion', component: () => import('pages/SignInPage.vue') }
    ]
  },

  {
    path: '/main',
    component: () => import('layouts/MainLayout.vue'),
    children: [
      { path: '', component: () => import('pages/Index.vue') },
      { path: '/dashboard', component: () => import('pages/DashboardB2B.vue'),
          beforeEnter: (to, from, next) => {
            const store = require('../store')
            console.log("before enter")
            console.log(store.myStore.getters)
            return next();
        }, },
      {
        path: '/ajouter-un-referentiel',
        component: () => import('pages/ReferentielMetier.vue')
      },
      {
        path: '/init',
        component: () => import('components/bot/BotSkeleton.vue')
      }
    ]
  },
  {
    path: '/bot',
    component: () => import('layouts/Bot.vue'),
    children: [
      {
        path: '/ajouter-un-referentiel',
        component: () => import('pages/ReferentielMetier.vue')
      },
      {
        path: '/init',
        component: () => import('components/bot/BotSkeleton.vue')
      }
    ]
  },

  // Always leave this as last one,
  // but you can also remove it
  {
    path: '*',
    component: () => import('pages/Error404.vue')
  }
]

export default routes
 

И вот index.ts с хранилищем (Vuex):

 import Vue from 'vue'
import { store } from 'quasar/wrappers'
import Vuex from 'vuex'
Vue.use(Vuex)

import matching from './modules/matching'
import orga from './modules/organigrame'
import user from './modules/user'

export interface StateInterface {
  example: unknown
}

let myStore: any

export default store(function({ Vue }) {
  Vue.use(Vuex)

  const Store = new Vuex.Store<StateInterface>({
    modules: {
      matching,
      orga,
      user
    },

    // enable strict mode (adds overhead!)
    // for dev mode only
    strict: !!process.env.DEBUGGING
  })

  myStore = Store

  return Store
})

export {myStore}
 

РЕДАКТИРОВАТЬ: похоже, мои console.log запуски выполняются до загрузки геттеров, потому что, когда я проверяю инструменты разработчика Vue, я вижу все. Как я могу проверить хранилище, если само хранилище не загружается перед beforeEnter функцией?

Комментарии:

1. Я думаю, что async / await может помочь вам здесь. попробуйте async / await или promise всякий раз, когда вы пытаетесь получить данные хранилища перед маршрутизатором.

2. Привет, @Nik. Разработчик, у вас есть какие-нибудь идеи о том, куда я должен поместить эту асинхронность / ожидание? Пробовал Async beforeEnter() и ожидал console.log (store.MyStore.getters.userInfos), и это то же самое

Ответ №1:

пожалуйста, попробуйте вот так

 store.myStore.getters["userInfos"]
 

Ответ №2:

попробуй это

 router.beforeEach(async(to, from, next) => {
    const userInfo = await store.getters.userInfos;
    console.log(userInfo);
});
 

Комментарии:

1. мне пришлось поместить это в index.ts (router) с помощью Router.beforeEach, потому что у меня был маршрут, а не маршрутизатор в файле routes.ts. У меня тоже такая же проблема… так странно

2. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и с большей вероятностью привлекут голоса.