Vue学习计划-Vue2--VueCLi(八)vuex统一状态管理实现数据共享

1. vuex是什么

概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。这个怎么理解呢?可以暂时理解成全局事件总线、消息订阅与发布一样的道理,把vuex当成是外部的一个储存空间,内部储存着方法和状态。看一下图:
在这里插入图片描述
其中呢:
state:是一个对象,目的是保存具体的数据
actions对象,目的是响应组件中用户的动作,可以理解成里面储存的是方法,里面可以写同步方法也可以写异步方法
mutations对象,目的是修改state中的数据,是同步的

2. 什么时候使用vuex

  1. 多个组件依赖于同一状态
  2. 来自不同组件的行为需要变更同一状态

3. 搭建环境

  1. 创建文件: src/store/index.js
// 引入 Vue 核心库
import Vue from 'vue'
// 引入vuex
import Vuex from 'vuex'
// 引用 vuex
Vue.use(Vuex)

// 创建并暴露store
export default new Vuex.Store({
// 准备state对象 —— 保存具体的数据
state: {
    num: 0
},
// 准备actions对象 —— 响应组件中用户的动作
actions: {},
// 准备mutations对象 —— 修改state中的数据
mutations: {}
})
  1. main.js中创建vm时传入store配置项
// 引入 store
import store from './store'
...
// 创建vm
new Vue({
   router,
   store,
   render: h => h(App)
}).$mount('#app')

4. 基本使用

  1. 初始化数据、配置actions、配置mutations、操作文件store.js
// 引入 Vue 核心库
 import Vue from 'vue'
 // 引入vuex
 import Vuex from 'vuex'
 // 引用 vuex
 Vue.use(Vuex)

 // 创建并暴露store
 export default new Vuex.Store({
     // 初始化数据
     state: {
         num: 0
     },
     actions: {
         // 响应组件中加的动作
         jia (context, value) {
         // console.log('action中的jia被调用了‘,context, value)
         context.commit('JIA', value)
         }
     },
     mutations: {
         // 执行JIA
         JIA (state, value) {
         // console.log('mutations中的JIA被调用了', state, value)
         state.sum += value
         }
     }
 })
  1. 组件中读取vuex中的数据:$store.state.sum
  2. 组件中修改vuex中的数据:$store.dispatch('action中的方法名', 数据)或者$store.commit('mutations中的方法名', 数据)

5. getters的使用

  1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工,类似于计算属性computed
  2. store.js中追加getters配置
   getters: {
       bigSum (state) {
       return state.sum * 10
       }
   },
  1. 在组件中读取数据: $store.getters.bigSum

6. 四个辅助函数map方法的使用

  1. mapState方法:用于帮助我们映射state中的数据为计算属性

组件内,我们可以写作computed: mapState({sum: 'sum', school: 'school'})
但是由于组件内除了state的数据,我们可能还有其他计算属性,所以我们利用·ES6·语法进行解构,下方mapGetters同理

computed:{
   // 借助mapState生成计算属性,sum,school(对象写法)
    ...mapState({sum: 'sum', school: 'school'})
  // 借助mapState生成计算属性,sum,school(数组写法)
   ...mapState(['sum', 'school'])
}
  1. mapGetters方法:用于帮助我们映射getters中的数据为计算属性
computed:{
    // 借助mapGetters生成计算属性,bigSum(对象写法)
    ...mapGetters({bigSum: 'bigSum'})
    // 借助mapGetters生成计算属性,bigSum(数组写法)
    ...mapGetters(['bigSum'])
}
  1. mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数
methods:{
    // 靠mapActions生成方法,bigSum(对象写法)
    ...mapActions({bigSum: 'bigSum'})
    // 靠mapActions生成方法,bigSum(数组写法)
    ...mapActions(['bigSum'])
}
  1. mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数
methods:{
    // 靠mapMutations生成方法,bigSum(对象写法)
    ...mapMutations({bigSum: 'bigSum'})
    // 靠mapMutations生成方法,bigSum(数组写法)
    ...mapMutations(['bigSum'])
}

一个不错的示例:准备父组件App.vue、vuex的store.js、子组件MySchool.vue、MyStuden.vue
1. App.vue中:引入一个动态组件的概念:
在这里插入图片描述
2. store.js文件中:
在这里插入图片描述
3. myschool.vue组件内:
在这里插入图片描述
4. MyStudent.vue组件:
在这里插入图片描述
疑问:对于上述不错的案例,我们能体会到vuex帮我们共享数据的方便,但上述案例还有个不足,是什么呢?

  1. 学校状态数据和一些与学校无关的数据状态(count、price)都在一个state中设置
  2. 假若学生的数据状态也需要共享,是不是也要放在state,``
  3. 上述中目前只有一个action,若在有一个操作学生组件的方法呢?是不是也要放在action中呢?
  4. mutationsgetters同样的问题,那么针对这几个问题我们就形成了如下的形式:
    在这里插入图片描述
    actions、mutations、getters同理,这就造成了混乱与臃肿,不利于开发和维护,所以我们最好将他们拆解为单独的模块,每一个模块控制数据自己模块的数据与方法,这就需要vuex的模块化

7. 模块化 + 命名空间(namespaced

  1. 目的: 让代码更好维护,让多种数据分类更加明确,模块独立,自己掌控自己的状态与方法
  2. 修改store.js
const aboutModule = {
    namespaced: true, // 开启命名空间
    state: {...},
    mutations: {...},
    actions: {...},
    getters: {...}
},
 const userModule = {
    namespaced: true, // 开启命名空间
    state: {...},
    mutations: {...},
    actions: {...},
    getters: {...}
},
const store = new Vuex.Store({
    modules: {
       aboutModule,
       userModule 
    }
})
  1. 开启命名空间后,组件中读取state数据:
// 方式一:直接自己读取
this.$store.state.aboutModule.list
// 方式二:借助`mapState`读取
...mapState('aboutModule',['list', 'name'])
  1. 开启命名空间后,组件中读取getters数据:
// 方式一:直接自己读取
this.$store.getters['aboutModule/list']
// 方式二:借助`mapGetters`读取
...mapGetters('aboutModule',['list', 'name'])
  1. 开启命名空间后,组件中调用dispatch
// 方式一:直接自己读取
this.$store.dispatch('aboutModule/getList', params)
// 方式二:借助`mapActions`读取
...mapActions('aboutModule',{getList, getData})
  1. 开启命名空间后,组件中调用commit
// 方式一:直接自己读取
this.$store.commit('aboutModule/getList', params)
// 方式二:借助`mapMutations`读取
...mapMutations('aboutModule',{getList, getData})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gitlab 安装

1.安装依赖 sudo apt updatesudo apt-get upgradesudo apt-get install curl openssh-server ca-certificates postfix安装gitlab curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash官网下载安装包 要选ubuntu focal 安…

【Hadoop】HDFS设计思想

HDFS设计思想为什么HDFS上的块为什么远远大与传统文件系统? HDFS设计思想 首先需要明确HDFS部署在集群之上。 假设有一个50G的文件,在HDFS中分布式的存储这个文件,首先需要将50G文件分成多个数据块,块的大小可以设置,…

一二三应用开发平台部署文档——开发环境搭建手册

背景 开源平台在ReadMe文档中简要描述了如何部署与启动以及重要注意事项,有小伙伴私信我希望提供一个详细具体的部署说明,然后联想到自己出于学习或研究目的,去搭建一些开源项目时,面对简要的说明也经常遇到障碍,比如…

在金属/绝缘体/p-GaN栅极高电子迁移率晶体管中同时实现大的栅压摆幅和增强的阈值电压稳定性

标题:Simultaneously Achieving Large Gate Swing and Enhanced Threshold Voltage Stability in Metal/Insulator/p-GaN Gate HEMT (IEDM2023) 摘要 摘要:对于增强型GaN功率晶体管的发展,栅压摆幅和阈值电压稳定性通常是互相排斥的。本文展…

c++11--保证稳定性和兼容性

保证稳定性和兼容性 1.变长参数宏定义及__VA_ARGS__ C99中&#xff0c;可使用变长参数空定义&#xff0c;即在宏定义参数列表最后一个参数为省略号。 预定义宏__VA_ARGS__可在宏定义实现部分替换省略号代表的内容。 #include <stdio.h> #define LOG(...) {\fprintf(std…

RTD2513A RTD2513BA 1VGA+2HDMI转双通道1080P LVDS 显示驱动芯片介绍

转载&#xff1a; 易显LCD显示方案设计www.rtddisplay.com

基于Java+Swingt学生信息管理系统

基于JavaSwing学生信息管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 1.用户登陆&#xff1a;在帮助按钮处&#xff0c;可以查看登陆账号及密码&#xff1a; 账号admin,密码123456 在未输入的情况下&#xff0c;会提示用户名不能为空&#xff…

git 切换远程地址分支 推送到指定地址分支 版本回退

切换远程地址 1、切换远程仓库地址&#xff1a; 方式一&#xff1a;修改远程仓库地址 【git remote set-url origin URL】 更换远程仓库地址&#xff0c;URL为新地址。 git remote set-url https://gitee.com/xxss/omj_gateway.git 方式二&#xff1a;先删除远程仓库地址&…

正点原子驱动开发BUG(一)--SPI无法正常通信

目录 一、问题描述二、讲该问题的解决方案三、imx6ull的spi适配器驱动程序控制片选分析3.1 设备icm20608的驱动程序分析3.2 imx的spi适配器的驱动程序分析 四、BUG修复测试五、其他问题 一、问题描述 使用正点的im6ull开发板进行spi通信驱动开发实验的时候&#xff0c;主机无法…

Redis Set类型

集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是无序的 2&#xff09;元素不允许重复 一个集合中最多可以存储2的32次方个元素。Redis 除了支持集合内的增删查改操作&#xff0c;同时还支持多个集合取交…

【ZYNQ学习】PL第一课

这节课讲什么&#xff1f; 这节课的名字本来是想写为LED&#xff0c;但这一课里除了LED也有按键&#xff0c;又想换为GPIO控制&#xff0c;但关于PL的GPIO控制&#xff0c;不应该这么草率和简单&#xff0c;而且这一课有很多和ZYNQ或者PL关联性不强的东西要说。 所以我写了删删…

基于AT89C52单片机的计算器设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88637995?spm1001.2014.3001.5503 源码获取 B 源码仿真图课程设计51 摘 要 计算器一般是指“电子计算器”,能进行数学运算的手持机器&#xff0c;拥有集成电路芯…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

适用于 Windows 和 Mac 的 10 款最佳照片恢复软件(免费和付费)

丢失照片很容易。这里点击错误&#xff0c;那里贴错标签的 SD 卡&#xff0c;然后噗的一声&#xff0c;一切都消失了。值得庆幸的是&#xff0c;在技术领域&#xff0c;你可以纠正一些错误。其中包括删除数据或格式化错误的存储设备。 那么&#xff0c;让我们看看可用于从 SD …

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先&#xff0c;我们先来说下什么是人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理&#xff0c;使其能够感知环境、理解和…

Unity中URP下的菲涅尔效果实现(个性化修改)

文章目录 前言一、我们修正一下上篇文章中&#xff0c;可能遗留的Bug1、N向量 变为 单位向量2、使颜色范围在合理区间 二、实现菲涅尔效果强弱可自定义调节三、修改菲涅尔效果颜色1、在属性面板定义颜色属性2、在常量缓冲区申明该参数3、在片元着色器中&#xff0c;用颜色和菲涅…

【日积月累】Mysql性能优化

目录 【日积月累】Mysql性能优化 1.前言2.MySql性能优化的主要方面2.1硬件和操作系统成面优化2.2架构设计层优化&#xff08;表结构&#xff09;2.3程序配置优化2.5表结构及索引优化2.4sql执行优化 3.总结4.参考 文章所属专区 积月累 1.前言 MySQL是一种常用的开源关系型数据…

【PHP入门】1.1-PHP初步语法

-PHP语法初步- PHP是一种运行在服务器端的脚本语言&#xff0c;可以嵌入到HTML中。 1.1.1PHP代码标记 在PHP历史发展中&#xff0c;可以使用多种标记来区分PHP脚本 ASP标记&#xff1a; <% php代码 %>短标记&#xff1a; <? Php代码 ?>&#xff0c;以上两种…

【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51

代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统&#xff0c;采用了基于8051架构的单片机&#xff0c;使用Keil C51编译器。 主要功能包括&#xff1a; 数码管显示&#xff1a;使用了四个数码管&#xff08;通过P2的控制…

从零开始在Linux服务器配置并运行YOLO8+Web项目

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 神经网络&#xff08;随缘更新&#xff09; ✨特色…