如何从 vue-router 访问 vuex getter 并设置守卫?

2024-01-04

我正在尝试使用 Vue 进行操作,但遇到了一些麻烦:

1:我无法从 router/index.js 文件访问我的 getters。 (我可以访问它,但它像带有返回函数的函数一样返回,我无法调用并获取值)

2:我无法正确设置守卫。使用 Angular 就容易多了

我在这里做错了什么?有什么建议么?

路由器代码

/* eslint-disable no-undef */
import Vue from "vue";
import VueRouter from "vue-router";
// import auth from '../store/modules/auth';
import { createNamespacedHelpers } from "vuex";
const { mapGetters } = createNamespacedHelpers("auth");
// import store from '../store';


Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "Home",
    component: () => import("../components/Home.vue"),
    meta: { requiresAuth: true }
  },
  {
    path: "/users",
    name: "Users",
    component: () => import("../components/Users/Users.vue"),
    meta: { requiresAuth: true }
  },
  {
    path: "/sign-in",
    name: "SignIn",
    component: () => import("../components/SignIn/SignIn.vue"),
  }
];

const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes
});

router.beforeEach((to, from, next) => {
  const storeGetters = { ...mapGetters(['isAuthenticated', 'authStatus', 'test']) };

  const isUserLoggedIn = storeGetters.isAuthenticated;

  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (isUserLoggedIn) {
      console.log('user is authenticated');
      to; from;
      return next();
    } else {
      console.log('Access denied!');
      next({
        path: '/signIn',
        query: { redirect: to.fullPath }
      });
    }

    next({
      path: '/signIn',
      query: { redirect: to.fullPath }
    });

  } else {
    next();
  }

})

export default router;

Vuex 索引

import Vue from "vue";
import Vuex from "vuex";
import modules from "./modules"

Vue.use(Vuex);

export default new Vuex.Store({
  strict: true,
  modules,
  state: {
    testState: 'State value'
  },
  getters: {
    test: state => state
  }
});

验证模块(vuex)

import { apolloClient } from '@/vue-apollo';
import SignInGQL from "@/graphql/signIn.gql";

export default {
    namespaced: true,
    state: {
        token: null,
        authStatus: false
    },
    getters: {
        isAuthenticated: (state) => {
            console.log('state: ', state);
            return !!state.token;
        },
        authStatus: state => state.authStatus,
        test: state => state.authStatus
    },
    actions: {
        async signIn({ commit, dispatch }, formInput) {

            try {
                const { data } = await apolloClient.mutate({
                    mutation: SignInGQL,
                    variables: { ...formInput }
                })

                const { token } = data.signIn;
                await commit('setToken', token);
                localStorage.setItem('auth-token', token);
                await dispatch('setUser', token);
            } catch (e) {
                console.error(e)
            }
        },
        async setUser({ commit }, token) {
            const encodedPayload = token.split('.')[1];

            const { payload } = JSON.parse(atob(encodedPayload));

            // TODO: Set User information 
            await commit('signInUser', payload);
        }
    },
    mutations: {
        setToken(state, token) {
            state.token = token
        },
        signInUser(state, user) {
            console.log('authStatus: ', state.authStatus)
            state.authStatus = true
            state.user = { ...user }
            console.log('authStatus: ', state.authStatus)
        },
        logOutUser(state) {
            console.log('dispatched logOutUser')
            state.authStatus = ''
            state.token = '' && localStorage.removeItem('auth-token')
        }
    }
}

它似乎createNamespacedHelpers只会让事情变得复杂。导入商店:

import store from '@/store'; // <-- aliased path

像这样使用吸气剂:

const isAuthenticated = store.getters['auth/isAuthenticated'];
const authStatus = store.getters['auth/authStatus'];
const test = store.getters['auth/test'];

字符串的第一部分是 Vuex 模块名称,后面是 getter 名称。

这不仅使用起来更简单,而且在研究代码时更易读、更清楚 getter 来自哪个模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 vue-router 访问 vuex getter 并设置守卫? 的相关文章

  • 在 Vue.js 2 中将 props 作为初始数据传递的正确方法是什么?

    所以我想将 props 传递给 Vue 组件 但我希望这些 props 将来会从该组件内部发生变化 例如当我使用 AJAX 从内部更新该 Vue 组件时 所以它们仅用于组件的初始化 My cars listVue 组件元素 我将具有初始属性
  • Vue: vue-i18n: 无法翻译 keypath 的值,使用 keypath 的值作为默认值

    我正在使用 Vue 我想展示三种语言 英语 他加禄语和宿务语 现在我有错误 无法转换键路径 NavbarMobile home 的值 使用 keypath 的值作为默认值 我通过 console log this i18n locale 检
  • 如何在vuetify中设置固定工具栏?

    在 vuetify 中我使用工具栏
  • 我应该如何处理 Vuex 中的事件?

    我习惯使用全局事件总线来处理跨组件方法 例如 var bus new Vue Component A bus emit DoSomethingInComponentB Component B bus on DoSomethingInComp
  • Nuxt JS 插件是否可以只运行一次?

    我有几个 VueX 操作 仅在服务器上运行 并从nuxtServerInit 它们向外部服务发出 HTTP 请求 这会减慢 TTFB 的速度 我想实现一个缓存插件 可以从 Redis 存储和检索值 目的是避免在每个请求的操作中发出 HTTP
  • Vue Router - 使用 Vue 2 Composition API 获取路由参数

    我正在使用Vue 2 组合 API https github com vuejs composition api并想从我的 Vue Router 访问路由参数setup method 如中所述Vue 路由器文档 https next rou
  • Vue - 仅在第一个操作完成后调用异步操作

    我需要从组件内部调用 2 个操作 但第二个操作只能在第一个操作 100 完成其工作后才开始 我正在尝试这个 但它不起作用 mounted this store dispatch coinModule loadApiCoins then gt
  • Sails JS 在视图中包含节点模块

    我正在使用帆 http sailsjs com http sailsjs com 开发一个小平台 按照文档 一切都很顺利 但是作为这个 javascript 框架世界和 npm 等的新手 我在包含其他 node modules 并在 ejs
  • VueJS $store.dispatch 发送多个参数

    我想将第二个参数传递给调度调用 this store dispatch testAction this employee employeeId departmentId 我的商店操作如下 async testAction dispatch
  • VueJS - 访问已安装的存储数据

    我无法理解以下内容 我有一个store其中包含应用程序所需的变量 特别地 有一个globalCompanies哪些商店 globalCompanies current all currentName 在另一个组件中 我想执行以下操作 mou
  • { ...obj1, obj2 } 到底做什么[重复]

    这个问题在这里已经有答案了 假设我们有两个对象 const state fishes some obj data animals some obj data const animals some NEW data 在Vuex中有一个方法re
  • 多维数组、Vuex 和变异

    我正在尝试添加和删除存储在 Vuex 中的多维数组中的项目 数组是一组类别 每个类别又有一个子类别 无穷大 不是简单的二维数组 示例数据集是这样的 id 123 name technology parent id null children
  • 如何将 Jitsi Meet 添加到 Vuejs

    我已在 public html 的正文中加载了 jitsi meet 脚本 并且我有一个组件 如下所示
  • 有没有V型斗篷的反面?

    根据VueJS 文档 https v2 vuejs org v2 api v cloak v cloak 指令可用于隐藏未编译的 Mustache 绑定 直到 Vue 实例准备就绪 换句话说 我可以隐藏一个div或类似的东西 当 vue 准
  • 如何以编程方式启动 Vuetify 对话框并等待响应

    我对 Vue js 和 Vuetify 相当陌生 使用 AngularJS 好几年了 但我们公司正在转向 Vue js 我想要完成的是 当用户单击 登录 按钮时 它会执行一些检查 即用户名不能为空 并启动 Vuetify 对话框来提醒用户
  • Vue 监听 Vuex 提交吗?

    有没有一种方法可以监听 Vuex 提交 而不观察任何随提交而更改的属性 只是简单地找出是否发生了提交 我有一个 Filter 组件 想将其放入 NPM 包中 但我已经有一个用例 在该用例中 我希望设置一个 cookie 在选择过滤器时存储过
  • Vue.js 未捕获类型错误:_vueChartjs.Line.extend 不是函数

    刚刚启动 Vue js 和 webpack 我正在尝试将 vue chartjs 功能添加到我的项目中 我收到以下错误 Uncaught TypeError vueChartjs Line extend is not a function
  • Vue.js 中计算属性和普通数据的区别

    我观察到 当一个正常的财产来自data 和从它派生的计算属性通过事件传递 前者保持其反应性 而后者失去它 我为其设置了以下测试用例 也作为 JSFiddle https jsfiddle net christophfriedrich b27
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 简单的 Vue.js 计算属性说明

    我对 Vue js 并不陌生 但我会再次浏览文档 试图找出我第一次错过的任何内容 我在以下地方看到了这个声明使用计算属性的基本示例部分 https v2 vuejs org v2 guide computed html Basic Exam

随机推荐

  • Bitfinex 数据 API

    我正在尝试使用 bitfinex REST api 获取历史 OHLC 数据 文档如下 https bitfinex readme io v2 reference rest public candles https bitfinex rea
  • 如何在 C++ 中比较两个位图屏幕截图的字节到字节

    在问题的最后我的最后编辑 大家好 我必须实现一个功能来比较屏幕一部分的两个镜头 以便知道是否存在差异 变化 我写了类似下面的代码 但我无法让它工作 在代码中 COORDINATES RECT 是一个结构体 typedef struct CO
  • 当 Windows 进入睡眠模式然后唤醒时 setTimeout 不起作用

    我在 Chrome 中注意到了这一点 有人知道出了什么问题或解决方法吗 您可以使用setInterval相反 它继续运行 如果您需要一次性解决方案 请使用clearInterval删除计时器 setInterval如果计算机处于睡眠状态 而
  • 在视图模式中打开会话

    鉴于我选择的 JPA Hibernate 实现 Spring 和 开发框架 我问这个问题 我一直在思考实体层中的关系 例如 我有一个包含许多订单行的订单实体 我已经设置了我的应用程序 以便它急切地加载每个订单的订单行 您是否认为这是一种解决
  • C 使用信号同步进程

    好吧 我正在尝试自学如何发送信号 但我遇到了一个小问题 我不知道我做错了什么 现在发生的事情是 它正在执行父级 然后转到子级 然后返回父级 它没有执行我希望它执行的操作 即执行父级 用户定义其运行的时间量 然后杀死它然后转到子进程并在相同的
  • 使 tkinter 按钮大小相同

    我想让所有 tkinter 按钮的大小相同 无论文本如何 是否可以拉伸其他按钮以相互匹配或设置特定尺寸 因为我很难在文档中找到如何执行此操作 目前 按钮根据文本的大小进行拉伸 我的意思的例子 https i stack imgur com
  • 在 Selenium IDE 中使用 waitForCondition ( script,timeout )

    我使用 Firefox 的 Selenium IDE 扩展录制了一个脚本 我想添加命令 waitForCondition 我发现它需要两个参数 脚本和超时 在 Selenium IDE 中 每个命令都有 3 个文本字段 命令名称 我假设为
  • SendMessage(WM_COPYDATA) + 记录 + 字符串

    我想发送一条记录 现在只有一个字符串 但我将添加更多变量 这是我第一次处理记录 所以这可能是一个愚蠢的问题 但是 为什么这有效 type TDataPipe record WindowTitle String 255 end var Dat
  • Typescript 自动获取类中的接口属性

    你好 TypeScript 专家 我有以下代码 但我必须在类中重复接口属性 否则我会得到 类错误地实现了接口 使用接口时 是否有 TypeScript 简写可以执行此操作而无需声明Id number 以及该类中的所有其他属性 谢谢 inte
  • AffineTransform 不变换 Stroke?

    使用 Graphics2D 时scale 具有两个不同参数的函数 在 x 和 y 方向按不同比例缩放 稍后在此 Graphics2D 对象上绘制的所有内容也会缩放 这会产生奇怪的效果 即在一个方向上绘制的线条比在另一方向上绘制的线条更粗 下
  • EF Code First:获取 DbContext 的所有 POCO 类型

    有没有办法从指定的 DbContext 实例获取 POCO 的类型 您需要访问元数据工作区 http msdn microsoft com en us library system data metadata edm metadatawor
  • 如何在 Windows 上使 add_custom_command 配置特定?

    为了在我的一个项目中运行单元测试 我有一个自定义命令 它将可执行文件 库和其他相关文件复制到其他位置 以便它们可以使用特定的设置运行 而不是在它们所在的位置运行它们建造的 在 Linux 上 这非常简单 但在 Windows 上 我遇到了一
  • 如何同时编辑单词的所有突出显示实例?

    在 Notepad 中 每当您选择 HTML 文档 或 CSS 中的任何单词时 类似的单词都会自动突出显示 是否有一个快捷方式可以用来一次编辑所有这些突出显示的片段 目前 Notepad 6 9 2 版本中尚未内置选择所有相似文本并进行编辑
  • 如何使用 pubsub 模拟器在本地调用 firebase Schedule 函数

    我正在研究云功能 尤其是日程功能 我需要每 5 分钟定期触发一个函数 但仅在测试步骤中 我需要在 pubsub 模拟器上运行它而不部署它 怎么做 我尝试使用 firebase shell 但它只触发一次 exports scheduledF
  • 如何在 Windows 上安装和使用 cURL? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我无法在 Windows 上运行 cURL 我已经从以下位置下载了 cURL zip 文件here https curl haxx se
  • 通过 Firebase 动态链接传递多个参数 Android

    我使用了 Firebase Dynamics 链接 它可以打开我的应用程序 转到 Play 商店或转到 URL 但是当我通过链接传递一些参数时 我只能获取第一个参数 这是我的动态链接 https xx app goo gl link htt
  • 从其他库重新导出共享库符号 (OS X / POSIX)

    我的问题是 OS X on x86 64 特定的 但更值得赞赏的是适用于其他 POSIX 操作系统的通用解决方案 给定一些共享库 下面称为原始库 的符号名称列表 我希望我的共享库重新导出这些符号 重新导出 就像有人尝试根据我的库解析符号一样
  • 如何在 C# 中通过 VLC api 流式传输视频

    我正在从事视频广播的小型家庭项目 我找到了一些例子Example http csharpmagics blogspot com 但它不起作用 因为需要旧版本的库0 8 6 所以我找到了它 但是当我尝试从 API 获取组件时 我对非托管代码有
  • java.nio.file.FileAlreadyExistsException如何在java7中解决这个问题

    我正在编写代码 我正在使用 java nio api 创建一个目录 我的代码段是 Path target Paths get folder path xx 0 Set
  • 如何从 vue-router 访问 vuex getter 并设置守卫?

    我正在尝试使用 Vue 进行操作 但遇到了一些麻烦 1 我无法从 router index js 文件访问我的 getters 我可以访问它 但它像带有返回函数的函数一样返回 我无法调用并获取值 2 我无法正确设置守卫 使用 Angular