当前位置: 首页 > 知识库问答 >
问题:

定义Vue路由器路由时访问Vuex状态

张心水
2023-03-14

我有以下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')

我还为Vue路由器(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 }
]

我试图这样做,如果Vuex存储用户对象,并且将已验证的属性设置为false,则路由器会将用户重定向到登录页面。

我有这个:

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

问题是,我不知道如何从beForeeach函数内部访问Vuex商店的user对象。

我知道我可以在组件中使用BeforeRouteEnter来设置路由器保护逻辑,但这会使每个组件变得杂乱无章。我想在路由器级别集中定义它。

共有3个答案

暴招
2023-03-14

我最终把商店搬出了梅因。js并输入存储/索引。js,并将其导入路由器。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()
    }
})
贺皓
2023-03-14

您可以使用路由器。app访问路由器注入的根Vue实例,然后通过路由器定期访问存储。应用程序$存储

const router = new Router({
    routes,
})

router.beforeEach((to, from, next) => {
    // access store via `router.app.$store` here.
    if (router.app.$store.getters('user')) next();
    else next({ name: 'login' });
})

这里是API参考。

Vue 3中删除了router.app,但您仍然可以在使用路由器时添加它,如迁移指南中所述:

app.use(router)
router.app = app
司寇照
2023-03-14

正如这里所建议的,您可以做的是从存储所在的文件中导出存储,然后将其导入路由中。js。它将类似于以下内容:

你有一家商店。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

现在在航线上。js,您可以拥有:

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()
    }
})

大体上。您还可以导入存储

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')
 类似资料:
  • 英文原文: http://emberjs.com/guides/routing/defining-your-routes/ 当启动你的应用时,路由器会负责展示模板,载入数据,以及设置应用状态等任务。 这些都是通过将当前的URL与你定义的路由进行匹配来实现的。 1 2 3 4 App.Router.map(function() { this.route("about", { path: "/a

  • 例如:产品详细信息页面可能有一个标签式导航部分,默认显示产品概述。 当用户单击“技术规格”选项卡时,该部分将显示规格。 如果用户点击ID为3的产品,我们要显示产品详细信息页面,其中包含概述: 当用户点击 “Technical Specs”: localhost:3000/product-details/3/specs overview 和 specs 作为 product-details/:id的

  • 我正在尝试这样的东西 但是,当没有子路由的路由可以完美工作时,这段代码不起作用 我如何解决第一段代码?

  • 注册路由规则 route目录下的任何路由定义文件都是有效的,默认的路由定义文件是route.php,但你完全可以更改文件名,或者添加多个路由定义文件(你可以进行模块定义区分,但最终都会一起加载)。 ├─route 路由定义目录 │ ├─route.php 路由定义 │ ├─api.php 路由定义 │ └─...

  • 我是React Router的新手,我正试图通过一条路径将一些道具从我的父组件传递给子组件。 这是我的代码: 理想情况下,我希望能够从子组件触发。在做了一些研究后,我认为传递一个选项而不是会传递它,但是它不会。知道如何将函数传递到路由组件中吗?

  • 官方路由 对于大多数单页面应用,都推荐使用官方支持的vue-router库。更多细节可以看vue-router文档。 从零开始简单的路由 如果只需要非常简单的路由而不需要引入整个路由库,可以动态渲染一个页面级的组件像这样: const NotFound = { template: '<p>Page not found</p>' } const Home = { template: '<p>home