vuex进阶实战-用户登录及权限控制
项目文件结构 ▼
├── src # 源代码
│ ├── router # 路由
│ │ ├── index.js
│ ├── store # 全局 store管理
│ │ ├── index.js
│ │ ├── state.js # 数据仓库(数据的唯一来源)
│ │ ├── mutations.js # 修改数据
│ ├── views # views 所有页面
│ │ ├── Login.vue # 登录
│ │ ├── Home.vue # 首页
│ ├── App.vue # 入口页面
│ ├── main.js # 入口文件 加载组件 初始化等
src/router/index.js ▼
import Vue from "vue"; import VueRouter from "vue-router"; Vue.use(VueRouter); const router = new VueRouter({ mode: "hash", base: "/", routes: [ { path: "/", name: "Home", component: () => import("../views/Home.vue") }, { path: "/login", name: "Login", component: () => import("../views/Login.vue") } ] }); export default router;
src/store/index.js ▼
import Vue from "vue"; import Vuex from "vuex"; import state from "./state"; import mutations from "./mutations"; Vue.use(Vuex); export default new Vuex.Store({ state, // 数据仓库(数据的唯一来源) getters: {}, // 用来获取数据(计算属性) mutations, // 用来修改数据的(相当于function,同步) actions: {}, // 用来提交mutation(异步) modules: {} // 模块化 });
src/store/state.js ▼
export default { // 个人信息 userInfos: undefined };
src/store/mutations.js ▼
export default { login(state, data) { state.userInfos = data; } };
src/views/Login.vue▼
<template> <div> <form> 用户名: <input type="text" name="username" v-model="form.username" /> 密码 <input type="password" name="password" v-model="form.password" /> <input @click="onSubmit" value="登录" /> </form> </div> <template> <script> export default { name: "Login", data() { return { form: { username: undefined, password: undefined }, } }, methods: { onSubmit() { this.$store.commit("login","落花看风雪"); // 此处存入用户信息
this.$router.push("./"); // 跳转到首页 } } } </script>
src/main.js ▼
import Vue from "vue";
import App from "./App.vue";
import router from "./router"; // 路由
import store from "./store"; // 引用vuex
// VueRouter导航守卫 无登陆信息直接跳转到登陆页面
router.beforeEach((to, from, next) => {
if (store.state.userInfo || to.path("/login")) {
next();
} else {
next({
path: "/login"
});
}
});
new Vue({
router,
store,
render: h => h(App)
}).$mount("#app");
src/App.vue▼
<template> <div id="app"> <router-view /> </div> </template> <script> export default { name: "app" }; </script>
src/views/Home.vue▼
<template> <div>欢迎来到首页</div> </template> <script> export default { name: "Home" }; </script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通