从 VueRouter.beforeEach() 访问 Vuex 时存储 undefined

Posted

技术标签:

【中文标题】从 VueRouter.beforeEach() 访问 Vuex 时存储 undefined【英文标题】:Store undefined when accessing Vuex from VueRouter.beforeEach() 【发布时间】:2018-07-06 20:34:57 【问题描述】:

我正在尝试访问 Vuex 商店,如本文所示:here

我已经浪费了一个早上好,我确信这将是一个简单的错字,但它逃脱了我。在 beforeEach() => 体内,我得到“未定义存储”。

我正在使用 LoginForm 组件中的商店,它似乎在那里。 chrome 调试器中的 Vuex 选项卡显示了我期望的商店内容。我做错了什么?

从关键代码中剪切粘贴:

src/router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import LoginForm from '@/components/LoginForm'
import HomePage from '@/components/HomePage'
import store from '@/store'

Vue.use(VueRouter)

const router = new VueRouter(
    routes: [
        
            path: '/login',
            component: LoginForm
        ,
        
            path: '/home',
            component: HomePage,
            meta: requiresAuth: true
        
    ]
)

router.beforeEach((to, from, next) => 
    // store is undefined here
    const IsAuthenticated = store.getters.IsAuthenticated()
    if (to.matched.some(record => record.meta.requiresAuth) && !IsAuthenticated) 
        next(path: '/login', query:  redirect: to.fullPath )
     else 
        next()
    
)

export default router

编辑: 商店的出口似乎没问题。通过保持对导入商店的本地引用并引用它,它可以工作。在我使用 beforeEach() 时似乎与上下文有关。

const lStore = store;
router.beforeEach((to, from, next) => 
    // store is undefined here, lStore is good to go
    const IsAuthenticated = lStore.getters.IsAuthenticated()
    ...
)

【问题讨论】:

通过存储本地引用找到了解决方法。我会编辑我的问题。道具 paeloque 让我专注于此。 谢谢...本地商店解决了这个问题.... 在我的情况下,当你调试时,商店确实在 Chrome 工具中评估为 undefined,但实际上当这段代码运行时,它发现商店很好!这可能是一些 Chrome 内存优化,因为这个商店应该被包装到一个闭包中 【参考方案1】:

我也有类似的情况。就我而言:

我有存储模块。所以在/store/index.js 上导入的所有模块 在路由器/router/index.js上,我导入了商店 然后在路由器上使用 store getter 效果很好

store/index.js

...
import auth from './modules/auth'
Vue.use(Vuex)

export default new Vuex.Store(
  modules: 
    auth
  
)

路由器/index.js

...
import store from '../store/index.js'
...
router.beforeEach(async (to, from, next) => 
  console.log(store.getters['auth/isAuthenticated'])
  next()
)

【讨论】:

【参考方案2】:

这是最盛大的追尾练习。问题是我的吸气剂没有被称为“IsAuthenticated”(它也不是一个函数)。我让自己被我的调试器欺骗了。将所有代码恢复到原始帖子并将getter调用更改为

正确

const IsAuthenticated = store.getters.isAuthenticated

不正确

const IsAuthenticated = store.getters.IsAuthenticated()

在 Chrome 中,在该代码行上放置一个断点并尝试通过将鼠标悬停在代码上来检查“isAuthenticated”会产生原始指示的行为,即使该行的评估结果很好。

【讨论】:

【参考方案3】:

我有一个非常相似的代码,唯一相关的区别似乎是我在 router/index.js 中以以下方式导入商店:

import store from '@/store/index';

我的整个 router.js 是:

import Vue from 'vue';
import Router from 'vue-router';
import ProjectPage from '@/pages/ProjectPage';
import store from '@/store/index';


Vue.use(Router);

const router = new Router(
  routes: [
    
      path: '/',
      name: 'ProjectPage',
      component: ProjectPage,
    ,
  ],
);

router.beforeEach((to, from, next) => 
  // store is defined here
  console.log(store);
  debugger;
);


export default router;

【讨论】:

谢谢。那条评论//商店在这里是未定义的,是我的代码中的剪切粘贴,还是您确认它在您的示例中也没有定义? 那是剪切和粘贴。在我的这个导入的情况下,商店是在这一点上定义的......抱歉造成混淆 我想知道 store/index.js 导出是否有问题? 只导入@/store/index,目前只导入@/store 我有类似的问题,我已经导入了商店。然而,“这个”在我的吸气剂中是未定义的。如果我无法从 getter 访问“this”,我该如何访问 store?

以上是关于从 VueRouter.beforeEach() 访问 Vuex 时存储 undefined的主要内容,如果未能解决你的问题,请参考以下文章

从 NIB 与从代码加载自定义滑块:从代码加载时不存在子视图

如何从其他面板从 JTextField 获取输入

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?