使用 Vuex.Store 时我做错了什么?
What am I doing wrong when using Vuex.Store?
我想利用“Vuex Store”功能在整个项目中存储和使用“isAuthenticated”变量,据此,授予对路由的访问权限。我的错误是什么?我花了很多时间,审查了一堆将 vue 商店嵌入到项目中的不同方法,但没有任何结果。
我来自“商店”的“index.js”:
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
isAuth: false,
},
mutations: {
setAuthStatus(state, status) {
state.isAuth = status;
},
},
});
export default store;
我的“main.js”来自“root(src)”:
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import vuetify from './plugins/vuetify';
Vue.config.productionTip = false;
new Vue({
render: (h) => h(App),
store,
router,
vuetify,
}).$mount('#app');
浏览器错误:
比方说,您显示的代码中存在大量漏洞(或者您没有包含它们)。首先,isAuth
只是一个布尔值 (true/false)。您必须在某处使用它才能使其正常工作(即,在 router.js
文件中以防止根据条件导航到某些路线)。
下面是用户身份验证和角色的简单实现。我承认,它比你的例子复杂一点,但我想你会明白的。
路由器
import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import Home from "../views/Home.vue";
import store from "../store";
const routes: Array<RouteRecordRaw> = [
{
path: "/",
name: "Home",
component: Home,
},
{
path: "/admin",
name: "Admin",
component: () => import("../views/Admin.vue"),
children: [],
meta: { role: "admin", requiresAuth: true },
},
{
path: "/manager",
name: "Manager",
component: () => import("../views/Manager.vue"),
children: [
{
path: "/employees",
name: "Employees",
component: () => import("../views/children/manager/Employees.vue"),
},
],
meta: { role: "manager", requiresAuth: true },
},
{
path: "/employee",
name: "Employee",
component: () => import("../views/Employee.vue"),
children: [],
meta: { role: "employee", requiresAuth: true },
},
{
path: "/login",
name: "Login",
component: () => import("../views/Login.vue"),
meta: { requiresAuth: false },
},
{
path: "/about",
name: "About",
component: () => import("../views/About.vue"),
meta: { requiresAuth: false },
},
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
router.beforeEach((to) => {
if (to.meta.requiresAuth && !store.getters.isLoggedIn) {
return { path: "login" };
} else if (to.meta.role && to.meta.role !== store.getters.userRole) {
return { path: store.getters.userRole };
}
});
export default router;
这里有两项是关键。某些路由上的 meta
属性 和在每个路由更改上运行的 beforeEach
方法。
meta 属性 只是告诉路由器,“嗨,这些是我的条件,你必须满足它们才能进入”(我们在 beforeEach
方法中通过检查强制执行) .
商店
import { createStore } from "vuex";
import { User } from "../types";
export default createStore({
state: {
user: <User>{},
},
getters: {
isLoggedIn: (state): boolean => !!Object.keys(state.user).length,
userRole: (state): string => state.user.role,
},
mutations: {
SET_USER(state, user): void {
state.user = { ...user };
},
},
actions: {},
modules: {},
});
我们正在将其导出到 router.js
文件,该文件使用 getters
作为 beforeEach
方法。
应用程序
import { createApp } from "vue";
import App from "./App.vue";
import "./registerServiceWorker";
import router from "./router";
import store from "./store";
createApp(App).use(store).use(router).mount("#app");
主文件中不应包含任何特殊内容。
版本
Vuex 4.0 与 Vue3 兼容,因此请确保您使用的是 Vue3(根据您的语法,它看起来不像)。
我想利用“Vuex Store”功能在整个项目中存储和使用“isAuthenticated”变量,据此,授予对路由的访问权限。我的错误是什么?我花了很多时间,审查了一堆将 vue 商店嵌入到项目中的不同方法,但没有任何结果。
我来自“商店”的“index.js”:
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
isAuth: false,
},
mutations: {
setAuthStatus(state, status) {
state.isAuth = status;
},
},
});
export default store;
我的“main.js”来自“root(src)”:
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import vuetify from './plugins/vuetify';
Vue.config.productionTip = false;
new Vue({
render: (h) => h(App),
store,
router,
vuetify,
}).$mount('#app');
浏览器错误:
比方说,您显示的代码中存在大量漏洞(或者您没有包含它们)。首先,isAuth
只是一个布尔值 (true/false)。您必须在某处使用它才能使其正常工作(即,在 router.js
文件中以防止根据条件导航到某些路线)。
下面是用户身份验证和角色的简单实现。我承认,它比你的例子复杂一点,但我想你会明白的。
路由器
import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import Home from "../views/Home.vue";
import store from "../store";
const routes: Array<RouteRecordRaw> = [
{
path: "/",
name: "Home",
component: Home,
},
{
path: "/admin",
name: "Admin",
component: () => import("../views/Admin.vue"),
children: [],
meta: { role: "admin", requiresAuth: true },
},
{
path: "/manager",
name: "Manager",
component: () => import("../views/Manager.vue"),
children: [
{
path: "/employees",
name: "Employees",
component: () => import("../views/children/manager/Employees.vue"),
},
],
meta: { role: "manager", requiresAuth: true },
},
{
path: "/employee",
name: "Employee",
component: () => import("../views/Employee.vue"),
children: [],
meta: { role: "employee", requiresAuth: true },
},
{
path: "/login",
name: "Login",
component: () => import("../views/Login.vue"),
meta: { requiresAuth: false },
},
{
path: "/about",
name: "About",
component: () => import("../views/About.vue"),
meta: { requiresAuth: false },
},
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
router.beforeEach((to) => {
if (to.meta.requiresAuth && !store.getters.isLoggedIn) {
return { path: "login" };
} else if (to.meta.role && to.meta.role !== store.getters.userRole) {
return { path: store.getters.userRole };
}
});
export default router;
这里有两项是关键。某些路由上的 meta
属性 和在每个路由更改上运行的 beforeEach
方法。
meta 属性 只是告诉路由器,“嗨,这些是我的条件,你必须满足它们才能进入”(我们在 beforeEach
方法中通过检查强制执行) .
商店
import { createStore } from "vuex";
import { User } from "../types";
export default createStore({
state: {
user: <User>{},
},
getters: {
isLoggedIn: (state): boolean => !!Object.keys(state.user).length,
userRole: (state): string => state.user.role,
},
mutations: {
SET_USER(state, user): void {
state.user = { ...user };
},
},
actions: {},
modules: {},
});
我们正在将其导出到 router.js
文件,该文件使用 getters
作为 beforeEach
方法。
应用程序
import { createApp } from "vue";
import App from "./App.vue";
import "./registerServiceWorker";
import router from "./router";
import store from "./store";
createApp(App).use(store).use(router).mount("#app");
主文件中不应包含任何特殊内容。
版本
Vuex 4.0 与 Vue3 兼容,因此请确保您使用的是 Vue3(根据您的语法,它看起来不像)。