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'// 引入vueximport Vuex from 'vuex'// 引用 vuexVue.use(Vuex)// 创建并暴露storeexport default new Vuex.Store({// 初始化数据state: {num: 0},actions: {// 响应组件中加的动作jia (context, value) {// console.log('action中的jia被调用了‘,context, value)context.commit('JIA', value)}},mutations: {// 执行JIAJIA (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})

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

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

相关文章

【Unity入门】物体5种移动方法

目录 一、通过修改位置来实现移动二、通过物理系统实现位移三、通过CharacterController组件四、通过输入控制物体移动 一、通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法。 使用Translate()函数 /*物体将向x方向移动1.5单位…

18、vue3(十八):菜单权限,按钮权限,打包,发布nginx

目录 一、菜单权限和路由拆分 1.思路分析 2.深拷贝插件 3.代码实现 4.效果展示

Javascript 嵌套函数 - 递归函数 - 内置函数详解

Javascript 嵌套函数 - 递归函数 - 内置函数详解 目录 Javascript 嵌套函数 - 递归函数 - 内置函数详解 一、嵌套函数 二、递归函数 三、内置函数 在了解了函数的定义和函数调用外,下面我们来介绍一下JavaScript中几种特殊的函数。 JavaScript特殊函数有3种&a…

AVL树-详细解析【数据结构】

AVL树是首个被发明的自平衡二叉查找树,在1962年由两位苏联科学家G.M. Adelson-Velsky和E.M. Landis提出。AVL树得名于发明者的首字母。在AVL树中,任何节点的两个子树的高度最大差别为一,确保了树的平衡度,使得查找操作相比于普通的…

JavaScript数组分组groupBy

JavaScript 最近发布了一个方法 Object.groupBy,可以对可迭代对象中的元素进行分组。 语法: Object.groupBy(items, callbackFn)items 被分组的可迭代对象,如 Array。 callbackFn 对可迭代对象中的每个元素执行的函数。 举个例子&#…

173.【2023年华为OD机试真题(C卷)】用连续自然数之和来表达整数(双指针法实现JavaPythonC++JS)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【华为OD机试AB必刷题目】题目描述解题思路题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码代码OJ评判结果代码讲解Python题解代码…

【Qt QML 入门】TextEdit

TextEdit可以显示多行可编辑的格式化文。默认是无边框的,可以和父控件完美融合。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: trueTextEdit {id: textEditanchors.centerIn: parenttext: "He…

并发编程中常见的设计模式

文章目录 一、 终止线程的设计模式1. 简介2. Tow-phase Termination(两阶段终止模式)—优雅的停止线程 二、避免共享的设计模式1. 简介2. Immutability模式—想破坏也破坏不了3. Copy-on-Write模式4. Thread-Specific Storage模式—没有共享就没有伤害 三…

Python之构造函数

参考: Python之构造函数_构造函数 python-CSDN博客 构造函数的特点: 创建对象;给对象的成员变量赋值 构造函数和成员函数之间的区别: 成员函数需要被手动调用,但是,构造函数在创建对象的过程中是自动被…

八大排序——快速排序(霍尔 | 挖空 | 前后指针 | 非递归)

我们今天来讲讲八大排序中的快速排序,快速排序最明显的特点就是排序快,时间复杂度是O(N* logN),但是坏处就是如果排序的是一个逆序的数组的时候,时间复杂度是O(N^2),还不用我们的插入…

被带偏的中国云计算,重归正途

文 | 智能相对论 作者 | 叶远风 阿里云战略聚焦公共云,对整个云计算市场而言都是一场自我审视。 从市场背景、行业发展、中外对比等多个方面,业界舆论给出了大量详实的数据分析,已经对阿里云为什么要聚焦公共云有了结论,这里不…

会 C# 应该怎么学习 C++?

会 C# 应该怎么学习 C? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家!!&a…

Vue3源码梳理:响应式系统的前世今生

响应性数据的前世 js的程序性: 一套固定的,不会发生变化的执行流程 1 )没有响应的数据 // 定义商品对象 const product {price: 10,quantity: 2 }// 总价格 let total product.price * product.quantity console.log(总价格:${total}) //…

【Linux】项目自动化构建工具 - make/Makefile

背景 会不会写makefile,从侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编…

云渲染技术下的虚拟现实:技术探索与革新思考

虚拟现实(含增强现实、混合现实)是新一代信息技术的重要前沿方向,是数字经济的重大前瞻领域,将深刻改变人类的生产生活方式,产业发展战略窗口期已然形成。但是虚拟现实想要深入改变影响我们的生活,以下技术…

数据结构和算法-最小生成树(prim和krusakal)和最短路径问题(BFS和dijkastra和floyd)

文章目录 最小生成树总览生成树广度优先生成树深度优先生成树最小生成树Prim算法Kruskal算法Prim vs KrusakalPrim的实现Kruskal的实现 小结 最短路径问题单源最短路径问题BFS求无权图的单源最短路径小结Dijkastra算法算法时间复杂度不适用情况 每一对顶点的最短路径问题Floyd算…

C语言目录

以下是根据韦东山C快速学习视频,一天时间过了一下,个人觉得收获很大 : 目录: C语言复习之变量:https://blog.csdn.net/qqmrchen124/article/details/135045434 C语言之结构体,变量赋值等: https://blog.csdn.net/qqmrchen124/arti…

SQL Server 远程连接服务器数据库

本文解决sql server的远程连接问题。需要开启防火墙,开启端口,并处理权限不足的报错: 【use 某数据库】The server principal "[server]" is not able to access the database "[database]" under the current security context. 【…

探秘 AJAX:让网页变得更智能的异步技术(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…