网站首页 > 博客文章 正文
我们在做后台系统的时候,经常会有比较多的功能页面,每个页面或多或少都会有需要存储在vuex中的数据,一般情况下我们会在state下定义不同的object,但是当功能一多,全部字段和action、mutations都定义在一个文件里,难免会使文件变得很难维护。全部页面的路由都定义在一个路由文件里也会使文件代码变得比较多,后期维护麻烦。所以我们应该将仓库和路由“模块化”,不同功能定义不同的模块文件,最后统一在index文件引入。
一、路由分模块
1.1 创建router文件夹,存放路由定义文件
- 创建modules文件夹,主要存放功能页面路由定义文件
- 创建index.js文件,定义路由
1.1-1 @/router/index.js
router/index.js主要功能是:
- 定义常规路由,即那些不需要权限就可访问的页面,比如说登录注册、后台主页、404页面等。
- 引入需要根据权限加载的路由模块
- 定义创建路由、重置路由方法
// index.js import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) // 定义常规路由 export const constantRoutes = [ { path: '/redirect', component: () => import('@/layout'), hidden: true, children: [ { path: '/redirect/:path*', component: resolve => void require(['@/views/redirect/index'], resolve) } ] }, { path: '/', redirect: '/login' }, { path: '/login', name: 'Login', component: resolve => void require(['@/views/login/index'], resolve), hidden: true }, { path: '/register', name: 'Register', component: resolve => void require(['@/views/login/register'], resolve), hidden: true }, { path: '/resetPsw', name: 'ResetPsw', component: resolve => void require(['@/views/login/resetPsw'], resolve), hidden: true }, { path: '/404', component: () => import('@/views/404'), hidden: true } ] /** 权限路由 * 是动态的路由、需要根据权限加载的路由 */ const modulesFiles = require.context('./modules', true, /\.js$/) const routesModules = [] // 自动引入modules目录下的所有模块 modulesFiles.keys().reduce((modules, modulePath) => { const value = modulesFiles(modulePath) routesModules.push(value.default) }, {}) export const asyncRoutes = routesModules /** 404路由 * 最终无法匹配到相应路由,重定向到404 * 异步加载路由时,在生成完异步路由准备挂载时,需要将重定向404的匹配规则定义在最后面,否则刷新会出错。 */ export const notFoundRoutes = [ { path: '*', redirect: '/404', hidden: true, meta: { title: '404' } } ] // 定义实例化路由的方法 const createRouter = () => new Router({ // mode: 'history', // require service support scrollBehavior: () => ({ y: 0 }), routes: constantRoutes // 挂载常规路由 }) // 实例化路由 const router = createRouter() // 定义实重置路由的方法 export function resetRouter() { const newRouter = createRouter() router.matcher = newRouter.matcher // reset router } export default router 复制代码
二、vuex仓库分模块
和router模块一样,咱也需要给store模块创建一个文件夹,在里头存放定义文件
2.1 创建store文件夹,存放vuex定义文件
- 创建modules文件夹,主要存放各模块下的仓库定义文件
- 创建index.js文件,初始化vuex实例
- 使用vuex持久化插件vuex-persistedstate,让你的数据可以实现刷新也不丢失噢~
2.1-1 @/store/index.js
该文件声明了vuex实例,同时批量引入modules下的store文件,也声明了vuex-persistedstate插件实例。
关于persistedState的初始化,注意vuex中的参数不是全部都要持久化,你可以根据业务逻辑自行定义需要持久化的参数
import Vue from 'vue' import Vuex from 'vuex' import getters from './getters' import createPersistedState from 'vuex-persistedstate' Vue.use(Vuex) // (创建了)一个包含了modules文件夹(包含子目录)下面的,所有文件名以 `.js` 结尾的、能被 require 请求到的文件的上下文。 const modulesFiles = require.context('./modules', true, /\.js$/) // keys() 方法用于从modules创建一个包含modules里键值的可迭代对象。 const modules = modulesFiles.keys().reduce((modules, modulePath) => { // 模块名,取文件名 const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') // 获取键名为modulePath的文件内容 const value = modulesFiles(modulePath) // 将文件中的默认导出模块 赋值给迭代对象modules modules[moduleName] = value.default // 返回迭代对象modules return modules // 默认值是空对象{} }, {}) // 创建仓库实例 const store = new Vuex.Store({ modules, getters, // 使用持久化插件 plugins: [ // 存储vuex状态,使之刷新不丢失 createPersistedState({ // 这里我用的是localStorage,你也可以改成sessionStorage,cookie也行不过我没研究嘻嘻嘻 storage: window.localStorage, reducer(val) { return { // 将要存储的state中的值放在这里 user: { name: val.user.name } } } }) ] }) export default store 复制代码
那我们就来看看咋使用,我们可以写个userjs来试试,里头定义登录登出的action,因为登录登出可能不止一个地方会运用到,而且登录登出可能会涉及到state里头好几个状态值的改变,所以我就把登录登出的逻辑写在action里头,这样分发的时候也可以改变状态值:
2.1-2 modules目录下新建user.js,用来存放用户信息,定义登陆、登出的action
import API from '@/assets/http/apiUrl' import Request from '@/assets/http' const user = { state: { token: '', name: '' }, mutations: { SET_TOKEN: (state, data) => { // 先初步定义token和username这两个值 state.token = data localStorage.setItem('ADMIN_TOKEN', data) }, SET_NAME: (state, data) => { state.name = data } }, actions: { // 登陆 Login({ commit }, params) { return new Promise((resolve, reject) => { Request.httpRequest({ method: 'post', url: API.Login, params: params, success: data => { commit('SET_TOKEN', data.token) resolve(data) }, error: err => { reject(err) } }) }) }, // 短信登录,这里为了方便我就直接复用登录的action了,正式项目中肯定要调用另外的接口 LoginByVin({ dispatch, commit }, params) { return dispatch('Login', params) }, // 重置token和state值 ResetToken({ commit }) { return new Promise(resolve => { commit('SET_TOKEN', '') commit('SEI_NAME', '') localStorage.removeItem('ADMIN_TOKEN') resolve() }) }, // 登出 LogOut({ dispatch, commit }) { return dispatch('ResetToken') } } } export default user 复制代码
新建之后不需要在index那里引入哦,因为我们已经写了批量引入的逻辑啦~是不是很方便呢
然后就是使用了,关于Login,在登陆页面只需要分发action就行:
params = { 'username': this.loginForm.user, 'password': this.loginForm.password } this.$store.dispatch('Login', params).then(() => { this.loading = false this.$router.push({ path: this.redirect || '/home' }) }).catch(() => { this.loading = false })
点赞+转发,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓-_-)
关注 {我},享受文章首发体验!
每周重点攻克一个前端技术难点。更多精彩前端内容私信 我 回复“教程”!
猜你喜欢
- 2024-09-23 zookeeper开山篇-编译安装与zk基础命令使用
- 2024-09-23 自建私有ZeroTier服务器踩坑(windows搭建私有zerotier服务器)
- 2024-09-23 CentOS 安装PHP7的正确姿势(centos安装php5.6)
- 2024-09-23 |Python笔记|解决No module named 'conda'
- 2024-09-23 Linux下设置命令在任何目录下可执行(mysql、redis命令)
- 2024-09-23 风靡全球的Ollama v0.3.8新版到达
- 2024-09-23 前端CLI脚手架思路解析并从0到1搭建
- 2024-09-23 Vue2的多种使用安装方法和出现问题的解决方法
- 2024-09-23 RHEL8和CentOS8怎么设置网络(旧方法被废弃)
- 2024-09-23 vue项目问题集(vue问题总结)
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)