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

本文主要是介绍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})

这篇关于Vue学习计划-Vue2--VueCLi(八)vuex统一状态管理实现数据共享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507342

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文