深度理解Vuex的用法及实例讲解

news2024/11/28 23:35:34

背景:

在项目里面写一个公共的方法,只要有需要的table的column需要变色就直接调用这个方法就好了,不需要在自己的子页面写方法。
如下图,写一个column变色的公共方法。
在这里插入图片描述

源代码:

下面的源代码将以上面背景需求为例子进行展示
在Vuex/modules文件夹下面写:

action.js

import * as types from './types.js';

export default {
  TableHeightRun: ({ commit }, data) => {
    commit(types.TABLEHEIGHTRUN, data);
  },
  ViewSet_isFirst: ({ commit }, data) => {
    commit(types.ISFIRST, data);
  },
  setProductArr: ({ commit }, data) => {
    commit(types.COLORPRODUCT, data);
  },
};

getters.js

const View_TableHeight = (state) => {
  return state.View.TableHeight;
};
const View_UserInfo = (state) => {
  return state.View.UserInfo;
};
const View_UserInfor = (state) => {
  return state.View.UserInfor;
};
const ViewGet_isFirst = (state) => {
  return state.View.isFirst;
};
export default {
  View_TableHeight,
  View_UserInfor,
  View_UserInfo,
  ViewGet_isFirst,
}

mutations.js

import { TABLEHEIGHTRUN, USERINFO, USERINFOR, ISFIRST, COLORPRODUCT } from './types';
import Table from '../../../utils/tableHeight'; // 重新计算高度

export default {
  [TABLEHEIGHTRUN](state, data) {
    // 计算表格高度
    data = data || ['.find', '.paging', 135];
    state.View.TableHeight = Table(data);
  },
  [USERINFO](state, data) {
    // 存储用户的信息
    state.View.UserInfo = Object.assign(data);
  },
  [USERINFOR](state, data) {
    // 存储医疗机构用户的信息
    state.View.UserInfor = Object.assign(data);
  },
  [ISFIRST](state, data) {
    // 存储医疗机构用户的信息
    state.View.isFirst = data;
  },
  [COLORPRODUCT](state, data) {
    // 存储column颜色
    const greenArr = [];
    const yellowArr = [];
    const redArr = [];
    data.forEach((item) => {
      switch (item.colorType) {
        case 1:
          greenArr.push(item.drugsNo);
          break;
        case 2:
          yellowArr.push(item.drugsNo);
          break;
        case 3:
          redArr.push(item.drugsNo);
          break;
        default:
          break;
      }
    });
    state.View.styleJson.greenArr = greenArr;
    state.View.styleJson.yellowArr = yellowArr;
    state.View.styleJson.redArr = redArr;
  },
};

state.js

export default {
  View: {
    // 公共数据管理
    TableHeight: 0, // 表格高度计算
    UserInfo: {
      // 用户信息
      userId: '', // 用户id
      userName: '', // 用户姓名
      memberId: '', // 会员id
      memberNo: '', // 会员编号
      memberType: '', // 会员类型(1生产企业、2经营企业、3医疗机构、4gpo、5管理员)
    },
    UserInfor: {}, // 医疗机构用户信息,
    isFirst: true, // 是否第一次进入页面
    styleJson: {
      greenArr: [],
      yellowArr: [],
      redArr: [],
    },
  },
};

types.js

export const TABLEHEIGHTRUN = 'TABLEHEIGHTRUN'; // 重新计算表格高度
export const USERINFO = 'USERINFO'; // 获取用户的信息
export const USERINFOR = 'USERINFOR'; // 获取医疗机构用户的信息
export const ISFIRST = 'ISFIRST'; //  是否第一次进入系统
export const COLORPRODUCT = 'COLORPRODUCT'; //  颜色产品数组
export const TABLECELLSTYLE = 'TABLECELLSTYLE'; //  表格单元格样式

index.js

import getters from './getters'
import state from './state'
import actions from './actions'
import mutations from './mutations'

export default {
  mutations,
  getters,
  actions,
  state
}

cellStyleMixins.js(在mixins文件夹下面)

const baseColor = {
  green: 'rgba(164,227,149)',
  yellow: '#f7f494',
  red: '#fc97af',
};

import store from '@/vuex/store';

export default {
  data() {
    return {
      mKey: 'drugsNo',
      lKey: 'drugsName',
    };
  },
  methods: {
    tableCellStyleFn({ row, column }) {
      const { greenArr, yellowArr, redArr } = store.state.ViewActions.View.styleJson;
      const rowCode=row[this.mKey]||row.productNo||row.drugsCode;
      let item ={};
      if (greenArr.includes(rowCode) && column.property === this.lKey) {
        item = { backgroundColor: baseColor.green };
      }
      if (yellowArr.includes(rowCode) && column.property === this.lKey) {
        item = { backgroundColor: baseColor.yellow };
      }
      if (redArr.includes(rowCode) && column.property === this.lKey) {
        item = { backgroundColor: baseColor.red };
      }
      return item;
    },
  },
};

index.vue(需要引用方法的子页面)

 <el-table
  :cell-style="cellStyle"
  :data="retTable"
  :height="View_TableHeight"
  :summary-method="getSummaries"
  @selection-change="dataSelect"
  @sort-change="sortChange"
  border
  fit
  show-summary
  stripe
  >
 <el-table-column type="selection" width="40"></el-table-column>
 <el-table-column label="#" prop="num" show-overflow-tooltip width="40"></el-table-column>
 ... //此处省略多余的代码
 </el-table>

import cellStyleMixins from '@/mixins/cellStyleMixins';
export default {
  mixins: [cellStyleMixins],
  ...
   methods: {
    cellStyle({row, column, rowIndex, columnIndex }) {
      let colorRes = this.tableCellStyleFn({ row, column });
      if (row.redFlag === 1) {
        colorRes = {
          ...colorRes,
          color: 'red',
        }
      }
      return colorRes;
    },
   },
}

index2.vue

<template>
  <div>
    <DialogList
     :cellStyleClass="tableCellStyleFn"
      :isShowDialog="options.isShowDialog"
      :tableSelected="options.tableSelected"
      :tableType="1"
      :msgBase="options.msgBase"
      :options="optionsDialog"
      @pageChange="dialogPage"
      @dataSelect="dialogSelect"
      @dataSearch="dialogSearch"
      @dialogHide="dialogHide"
    >
    </DialogList>
  </div>
</template>

Vuex/store.js

import modules from './modules';
// 创建 store 实例
export default new Vuex.Store({
  modules,
});

假如你对上面的小例子代码看的有点云里雾里,没有关系,那么接下来我将带你详细的理解一遍Vuex是干嘛的,以及讲讲是如何使用的?话不多说,我们直接上干货!

Vuex干货来啦

vuex官方文档:https://vuex.vuejs.org/zh/

Vuex是什么

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

Vuex的原理

以下是一个表示“单向数据流”理念的简单示意:
在这里插入图片描述

但是,当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

多个视图依赖于同一状态。
来自不同视图的行为需要变更同一状态。
对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。
对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。

因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!

通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。这就是 Vuex 背后的基本思想。

Vuex适用的场合

构建一个中大型单页应用,考虑如何更好地在组件外部管理状态,那么Vuex 是最好的选择。
简化之,就是应用简单的不用Vuex,一个简单的store模式就够了;要中大型单页应用以上才用它。

Vuex的组成部分及作用

state.js

状态存储
mapState 辅助函数:当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。

// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'

export default {
  // ...
  computed: mapState({
    // 箭头函数可使代码更简练
    count: state => state.count,

    // 传字符串参数 'count' 等同于 `state => state.count`
    countAlias: 'count',

    // 为了能够使用 `this` 获取局部状态,必须使用常规函数
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
}

getters.js

可以认为是 store 的计算属性。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
注意,getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果。
mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:

mutations.js

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Mutation 必须是同步函数,在 mutation 中混合异步调用会导致你的程序很难调试,在 Vuex 中,mutation 都是同步事务。

action.js

Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
Action 通过 store.dispatch 方法触发,
mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在根节点注入 store)。

module.js

模块(module)
为了解决"使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿"这个问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。

Vuex的项目结构

Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则:

  1. 应用层级的状态应该集中到单个 store 对象中。
  2. 提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。
  3. 异步逻辑都应该封装到 action 里面。

只要你遵守以上规则,如何组织代码随你便。如果你的 store 文件太大,只需将 action、mutation 和 getter 分割到单独的文件。

对于大型应用,我们会希望把 Vuex 相关代码分割到模块中。下面是项目结构示例:
在这里插入图片描述

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

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

相关文章

HTTP协议状态码大全 | 汇总HTTP所有状态码

&#x1f50a; HTTP 状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含 HTTP 状态码的信息头&#xff08;server header&#xff09;用以响应浏览器的请求。 HTTP…

统计软件与数据分析Lesson8----HTML初识

统计软件与数据分析Lesson8----HTML初识1.什么是 HTML&#xff1f;2.查看HTML源代码3.HTML 标签4.HTML 文档5.编写 HTML6.HTML 标签6.1 HTML 标题6.2 HTML 段落6.3 HTML 链接7.HTML 元素7.1HTML 嵌套元素7.2 HTML空元素8.HTML 属性9. HTML <div> 元素10.其它10.1 HTML 水…

七、网络安全

&#xff08;一&#xff09;网络安全设计 1、网络安全体系设计 &#xff08;1&#xff09;物理安全 通信线路的可靠性、硬软件设备的安全性、设备的备份、防灾害防干扰能力、设备的运行环境、不间断电源 eg机房安全 &#xff08;2&#xff09;系统安全 操作系统本身的缺陷…

MySQL数据库,表的增删改查详细讲解

目录 1.CRUD 2.增加数据 2.1创建数据 2.2插入数据 2.2.1单行插入 2.2.2多行插入 3.查找数据 3.1全列查询 3.2指定列查询 3.3查询字段为表达式 3.3.1表达式不包含字段 3.3.2表达式包含一个字段 3.3.3表达式包含多个字段 3.4起别名 3.5distinct(去重) 3.6order …

如何恢复回收站?数据恢复,这4招就够了!

案例&#xff1a;恢复回收站 【谁能帮帮我这个电脑小白呀&#xff1f;回收站里的文件被删除了还能恢复吗&#xff1f;怎么恢复回收站文件呢&#xff1f;求解答&#xff01;】 电脑的回收站给我们带来了很多的便利&#xff0c;我们可以将删除的数据放入回收站&#xff0c;也可…

OnnxRuntime----Lite-Mono单目深度估计ONNX推理

题目要求&#xff1a;学习了解单目深度估计模型Lite-Mono&#xff0c;根据上篇VSCode配置之OnnxRuntime(CPU) && YOLOv7验证&#xff0c;实现深度估计模型Lite-Mono推理&#xff0c;并集成到现有ONNX系列模型中。 Lite-Mono论文&#xff1a;Lite-Mono:A Lightweight CN…

运算放大器的内部结构-运放

运算放大器的内部结构 算放大器的内部电路&#xff0c;对于使用者在遭遇应用上的极限而导致无法达成系统设计规格时&#xff0c;非常有帮助。而虽然各家厂商推出的运算放大器性能与规格互有差异&#xff0c;但是一般而言标准的运算放大器都包含下列三个部分&#xff1a; 差动…

走进小程序【一】什么是小程序?

文章目录&#x1f31f;前言&#x1f31f;发展史&#x1f31f;什么是[微信小程序](https://developers.weixin.qq.com/miniprogram/dev/framework/)&#xff1f;&#x1f31f;微信小程序能做什么&#xff1f;&#x1f31f;小程序发展前景和优势&#x1f31f;写在最后&#x1f31…

ROS1学习笔记:launch启动文件的使用方法

参考B站古月居ROS入门21讲&#xff1a;launch启动文件的使用方法 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、launch的文件结构二、launch的文件语法2.1 根元素2.2 参数设置2.3 重映射和嵌套三、相关示例simple.launchturtlesim_parameter_config.launchstart_tf_d…

SpringBoot 整合 JSP和MyBatis

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【满血Buff】ChatGPT科普篇,三段式介绍,内含各种高效率插件

【满血Buff】ChatGPT科普篇&#xff0c;三段式介绍&#xff0c;内含各种高效率插件1、ChatGPT是什么2、为什么要掌握ChatGPT效能工具3、ChatGPT能做什么4、和ChatGPT相关的谷歌插件4.1 WebChatGPT4.2 OpenAI Ttanslator 翻译4.3 ChatGPT for Google本篇博客采用三段论的叙事方式…

Redis Cluster详解

文章目录集群设计目标Redis 集群协议中的客户端和服务器角色写入安全可用性(Availability)性能(Performance)避免合并(merge)操作主要模块介绍哈希槽(Hash Slot)Keys hash tagsCluster nodes属性Cluster总线集群拓扑节点握手请求重定向Moved 重定向ASK 重定向smart客户端状态检…

基于Tensorflow搭建卷积神经网络CNN(新冠肺炎医学图像识别)保姆及级教程

项目介绍 TensorFlow2.X 搭建卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现人脸识别&#xff08;可以识别自己的人脸哦&#xff01;&#xff09;。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠&#xff0c;然后经过全连接层&#xff0c;最后用softm…

物理世界的互动之旅:Matter.js入门指南

theme: smartblue 本文简介 戴尬猴&#xff0c;我是德育处主任 欢迎来到《物理世界的互动之旅&#xff1a;Matter.js入门指南》。 本文将带您探索 Matter.js&#xff0c;一个强大而易于使用的 JavaScript 物理引擎库。 我将介绍 Matter.js 的基本概念&#xff0c;包括引擎、世界…

【Jetpack】DataBinding 架构组件 ③ ( 使用 include 导入二级界面布局 | 二级页面绑定数据模型 )

文章目录一、使用 include 导入二级界面布局二、二级页面绑定数据模型1、将二级界面布局转为 DataBinding 布局2、在主布局中为二级界面布局传递数据模型三、核心代码示例1、主布局2、子布局3、Java 代码4、执行结果一、使用 include 导入二级界面布局 如果在 DataBinding 布局…

C++之深入解析虚函数表的实现及其内存布局

一、虚函数表概述 C 中的虚函数的作用主要是实现了多态的机制&#xff0c;关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数&#xff1a; Derive d; Base1 *b1 &d; Base2 *b2 &d; Base3 *b…

使用自己修改的特制舵机,支持关节角度回传的桌面级小机器工具人

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。

c++小知识

1、一般头文件&#xff1a; #include<iostream> using namespace std; 2、ios::sync_with_stdio(false); 其含义是取消cin与stdin的同步&#xff0c;cout和stdout的同步 cin.tie(0); tie是将两个stream绑定的函数&#xff0c;空参数的话返回当前的输出流指针。 3、…

从零开始搭建性能完备的网站-思路过程(1)

之前前端的一揽子技术基本都学完了&#xff0c;除了react和uniapp这些想做大前端需要学的东西&#xff0c;基本vue相关的东西都学过了&#xff0c;本来想做尚硅谷的后台项目&#xff0c;可是它使用的工具库实在是太老了&#xff0c;所以直接跳到自己搭建网站这一步来&#xff0…

尚硅谷大数据技术Zookeeper教程-笔记04【源码解析-源码详解】

视频地址&#xff1a;【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】尚硅谷大数据技术Zookeeper教程-笔记02【服务器动态上下线监听案例、ZooKeeper分布式锁案例、企业面试真…