Vue2 Vuex在大型项目中的应用

news2025/1/20 1:57:42

文章目录

  • 前言
  • 一、总体结构
  • 二、代码结构
    • 1. 文件层
    • 2. 一级功能模块
    • 3. 二级功能模块
    • 4. 总状态
  • 总结


前言

参考去年参与的大型ERP项目, 我主要负责财务模块的前端部分.
这个项目有几百个前端页面(具体多少没算过), 状态管理结构应该是具有参考价值的.


一、总体结构

项目标准中约定仅含有报表(或页面即报表)的页面能够使用Vuex. 使用时需要先创建该以该页面名称命名的目录, 目录下应当具备index.vue页面主体, report报表目录, 如果主页面需要组件那么还应当有components目录用于存放组件, 对于该页面中报表所需的组件, 需要在report内建立components目录存放.

对于页面的状态, 依据所处功能模块进行分类存放, 并在该模块目录同级设置入口文件引入并集中导出该模块状态.
模块之间依旧据此, 同一大模块下的小模块存放在一起, 同级设立入口文件, 将每个小模块的导出逐个导入集中后再次导出, 得到该大模块的状态.

在这里插入图片描述
当然, 在所有index.js入口文件同级, 可以描述对该模块的其他配置.
如果反映到视图, 大概是这样:

在这里插入图片描述
下面我会分层说明.


二、代码结构

1. 文件层

激活namespace后仅对应管理该页面状态的JavaScript文件.
其内部结构也就是Vuex代码的基本结构, 包括state, mutations, actions:
即上图EBEB201R.js及其并列文件的结构.

/**
 * @Description %$%&*((*
 * @Author ??
 * @Date 2022-09-20
 */

import { xxxSearch } from '@/api/xxx/xxxx'

const state = {
  reportId: 'xxxx',
  reportTitle: 'xxxxxx月度表(一)',
  dataTotal: 0,
  reportDataNoPag: [],
  reportDataPag: [],
  rawReportDataPag: [],
  reportTableData: [],
  columnTotal: []
}

const mutations = {
  SET_RAW_ROW (state, data) {},
  
  SET_TABLE_LOADING(state, data) {},
  
  SET_TABLE_DATE(state, data) {},
  
  SET_TABLE_EVENT (state, event) {},
  
  SET_SON_EVENT(state, data) {},
  
  SET_COLUMN_TOTAL(state, data) {}
}

const actions = {
  generateTableEvent ({ commit }, headerArr) {},

  async initTableData ({ commit, dispatch }, queryParams) {},

  updateTableData ({ commit, state }, pageIndex) {},

  initActions ({ commit, state }) {},

  resetData ({ commit }, params) {}
}

export default {
  namespaced: true,
  mutations,
  actions,
  state
}

另外为了防止混淆, mutations方法名统一使用大写.

然后所有的该模块下页面文件用modules目录包裹, 这些页面状态不应当与 对该功能模块的状态配置和入口文件 混杂在一起, 参考EBE_1/E_C_ZZZ/modules.

有关namespace:
store对象会因为过多的状态变得臃肿, 而namespace启用后, 允许store内的状态模块化, 一个单独的模块将拥有自己的state, mutation, actions, 相当于每个页面的状态独立但是集中的存储在了store里, 而非一体化的存储于store中, 在页面中以下方式调用:

import {mapActions, mapMutations, mapState} from 'vuex'
// computed
...mapState('模块名', [ // 模块名和导出时的名称有关
  'reportId',
  'beforeOutData',
  'reportTableData'
])
// methods
...mapMutations('模块名', [
  'SET_PRINT_FLAG',
  'SET_TABLE_DATE',
  'SET_TABLE_LOADING',
  'SET_EXCEL_OUT_FLAG',
  'SET_REPORT_PRINT_DATA'
]),
...mapActions('模块名', ['initTableData', 'initActions', 'resetData']),

this['SET_TABLE_DATE'](this.effcDate)

2. 一级功能模块

即文件直属的功能模块目录, 内部应当具备index.js入口文件来导出该模块下所有页面的状态, 和一些仅针对该模块的配置:

在这里插入图片描述

/**
 * @Description %&*^*(&^*%$%&
 * @Author ??
 * @Date 2022-09-20
 */

import EBEB201R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB201R'
import EBEB202R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB202R'
import EBEB203R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB203R'
import EBEB204R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB204R'
import EBEB205R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB205R'
import EBEB206R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB206R'
import EBEB207R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB207R'
import EBEB208R from '@/store/modules/report/EBE_1/E_C_ZZZ/modules/EBEB208R'

export const E_C_ZZZReportModule = {
  EBEB201R,
  EBEB202R,
  EBEB203R,
  EBEB204R,
  EBEB205R,
  EBEB206R,
  EBEB207R,
  EBEB208R
}

3. 二级功能模块

逻辑同二级功能模块, 逐个导入然后集中导出:

在这里插入图片描述

/**
* @author ??
* @date 2022-7-4
* @description index
*/

import { EBECCReportModules } from '@/store/modules/report/EBE_1/xxx'
import { EBECReportModule } from '@/store/modules/report/EBE_1/xxx'
import { EBEBReportModule } from '@/store/modules/report/EBE_1/xx'
import { EBEBBReportModule } from '@/store/modules/report/EBE_1/xx'
import { EBEWReportModule } from '@/store/modules/report/EBE_1/xxx'
import { EBEYReportModule } from '@/store/modules/report/EBE_1/xxxx'
import { E_C_ZZZReportModule } from '@/store/modules/report/EBE_1/E_C_ZZZ'

export const EBE1ReportModules = {
  ...EBECReportModule,
  ...EBEBReportModule,
  ...EBECCReportModules,
  ...EBEWReportModule,
  ...EBEYReportModule,
  ...EBEBBReportModule,
  ...E_C_ZZZReportModule
}

4. 总状态

得到最终传入Vuex类中, 去实例化挂载到Vue的状态:
在这里插入图片描述
report内所有一级功能模块的导出在report/index.js再次集中后导出:

// report/index.js
/*
 * @author ??
 * @date 2022-7-4
 * @description index
 */

import { EBEReportModules } from '@/store/modules/report/EBE'
import { EBE_1ReportModule } from '@/store/modules/report/EBE_1'
import { EBFReportModule } from '@/store/modules/report/EBF'

export const ReportModules = {
  ...EBEReportModules,
  ...EBE_1ReportModule,
  ...EBFReportModule
}

然后随着其他诸如permission.jsuser.js配置一起引入到上图的index.js, 进行Vuex实例的生成和挂载.

import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import permission from './modules/permission'
import settings from './modules/settings'
import user from './modules/user'
import { reportModule } from '@/store/modules/report'

Vue.use(Vuex);

const store = new Vuex.Store({
  modules: {
    app,
    permission,
    settings,
    tagsView,
    user
  }
})

export default store

总结

好吧, 希望这能帮得上忙.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CobaltStrike与Metasploit联动方法

文章目录CobaltStrike联动Metasploit方法一方法二Metasploit联动CobaltStrikeCobaltStrike联动Metasploit CobaltStrike (简称CS)及 MetaSploit (简称MSF)各有所长,CS更适合作为稳控平台,MSF更适用于与各类…

包体积优化·工具论·初识包体积优化

“ 【小木箱成长营】包体积优化系列文章: 包体积优化 实战论 怎么做包体积优化? 做好能晋升吗? 能涨多少钱? 包体积优化 方法论 揭开包体积优化神秘面纱 ”一、引言 Hello,我是小木箱,欢迎来到小木箱成长营系列教程,今天将…

预制菜开启春节之战,破局立新正在进行时

撰稿 | 火华 来源 | 贝多财经 对预制菜行业来说,2022年绝对是浓墨重彩的一年。 这条汇集了餐饮企业、专业预制菜企业、冷冻食品企业、农牧水产企业、生鲜电商企业的赛道,在乏善可陈的商业市场中野蛮生长一路高歌。 有调研数据显示,“自己做…

嵌入式linux-僵尸进程?

1.僵尸进程 1.1 僵尸进程的由来和概念 通常,子进程结束之后,需要父进程为子进程进行回收,俗称“收尸”,则回收子进程占用的一些内存资源,父进程通过调用wait()(或其变体 waitpid()、waitid()等&#xff0…

公共数据 | CnOpenData中国省际铁路通行时间数据

中国省际铁路通行时间数据 一、数据简介 本数据来自南京大学长江产业经济研究院《全国统一大市场下的省际铁路交通研究报告》的附录部分。中国的铁路(高铁)建设取得了辉煌成果。但受铁路时刻众多、历史数据不容易搜集整理的限制,学术与政策研…

Linux进程状态和优先级

我的另一篇有关进程概念的博客:Linux 进程概念 目录 一、操作系统进程状态 1.1 运行状态(R) 1.2 阻塞状态(S) 1.3 挂起状态(S) 二、Linux操作系统内核中的进程状态 2.1 进程状态种类 2.2 查看R和S进程状态 2.3 T和t状态 2.3.1 T状态 2.3.2 t状态…

python正则表达式与回溯绕过waf

1.正则表达式的背景 正则表达式的历史:美国的两个人类神经元研究者,使用特殊的符号描述。之后有一位科学家将这门技术引入了数学,将这门技术命名为正则表示式。 肯汤普森在编写UNIX系统时,将正则引入到了一个编辑器 绝大多数编…

GNN实战——KarateClub数据集

GNN:graph neural network 图神经网络,是⼀种连接模型,通过⽹络中节点之间的信息传递(message passing)的⽅式来获取图中的依存关系(dependence of graph),GNN通过从节点任意深度的邻居来更新该节点状态,这个状态能够表…

Linux网络编程 第四天

目录 学习目标 多路IO-poll 多路IO-epoll 进阶epoll 用实验验证LT和ET模式 epoll反应堆 学习目标 1 了解poll函数 2 熟练使用epoll多路IO模型 3 了解epoll ET/LT触发模式并实现 4 理解epoll边缘非阻塞模式并实现 5 了解epoll反应堆模型设计思想 6 能看懂epoll反应堆模型的…

《C++程序设计原理与实践》笔记 第10章 输入/输出流

在本章和下一章中,我们将介绍C标准库中用于处理来自各种源的输入和输出的功能:I/O流。本章关注基本模型:如何读写单个值,以及如何打开和读写整个文件。下一章将介绍具体细节。 10.1 输入和输出 如果没有数据,计算就毫…

【正点原子FPGA连载】第十三章Linux内核移植 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十三章Linux内…

2023版软件测试学习路线图(超详细自学路线)

送福利了!超详细的软件测试学习路线图来啦,2023版是首发哟!软件测试学习路线图分为9个阶段,包含:软件测试环境配置和管理-->软件测试数据管理与数据库测试-->web前端测试技术-->通用软件测试技术-->Python…

回顾2022! 链上NFT精彩项目大盘点

过去一年,WEB3和元宇宙无疑吸引了一大波关注度和热度。不少知名品牌如耐克、GUCCI、百事可乐、星巴克、麦当劳等都纷纷加入这波浪潮,通过推出NFT、数字商品等,来尝试WEB3机制,进而塑造更好的用户消费体验和参与度。NFT兼具身份、功…

springboot,vue二手交易平台

开发工具:IDEA服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7系统用户前台和管理后台两部分,项目采用前后端分离前端技术:vue elementUI服务端技术:springbootmybatis项目功…

0基础快速掌握正则表达式

背景 在日常开发中,我们经常会遇到使用正则表达式的场景,比如一些常见的表单校验,会让你匹配用户输入的手机号或者身份信息是否规范,这就可以用正则表达式去匹配。相信大多数人在碰到这种场景的时候都是直接去网上找,…

在 2023 ETH Denver 与 Cartesi 一起建设

我们非常高兴的加入了 2023年ETHDenver,参加了BUIDLathon 赛道和现场研讨会等活动。作为规模最大、持续时间最长的ETH 活动之一,我们将向热衷于为全球区块链生态系统做出贡献的新开发者社区分享 Cartesi 技术。你想在2023年#BUIDL 做一些有趣有意义的事情…

基于springboot的景区旅游信息管理系统(源代码+数据库)

基于springboot的景区旅游信息管理系统(源代码数据库) 一、系统介绍 本项目分为管理员与普通用户两种角色 用户登录 前台功能:旅游路线、旅游景点、旅游酒店、旅游车票、旅游保险、旅游策略管理员登录 后台功能:用户管理、旅游路线管理、旅游景点管理…

Codeforces Round #843 (Div. 2)(A~C,E)

A1/A2. Gardener and the Capybaras (easy version)三个字符串,按照顺序连在一起,三个字符串满足第二个字符串大于等于第一个和第三个,或者第二个字符串小于等于第一个和第三个,输出满足情况的三个字符串。思路:对于长…

ubuntu18.04系统下挂载新的机械硬盘

ubuntu18.04系统下挂载新的机械硬盘1.显示硬盘以及所属分区情况sudo fdisk -lDisk /dev/sda doesnt contain a valid partition table硬盘分区 对机械硬盘进行操作 sudo fdisk /dev/sda下图表示的是具体流程截图: The partition table has been altered!硬盘格式…

AWS RDS开启审计日志

问题 需要对AWS的RDS开启相关日志。先检查RDS是否开启日志,如下图: 选中一个数据库实例,查看到只开启了数据库的错误日志。但是,我们需要开启其他类型的审计日志。下面开始怎么样开启其他类型日志,来启用高级审计模…