Vuex
安装
引入
1、Vuex 是什么?
Vuex是一个专为Vue.js应用开发的状态管理模式。 它采用集中式储存管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
简单来说,用于维护组件之间的数据
什么是状态管理模式
包含以下几个部分
- state,驱动应用的数据源;
- view,以声明方式将state映射到视图;
- actions,响应在view上的用户输入导致的状态变化。
根据官网总结: 就是把组件的共享状态抽取出来,以一个全局单例模式管理,不论在哪个位置, 任何组件都能获取状态或者触发行为!
好处就是通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性, 我们的代码将会变得更架构化且易维护
1.1、在什么情况下我们使用Vuex?
举个栗子:不同的组件,都需要用户信息以及一些其它的公共数据,每个组件都发一遍请求浪费,不请求组件之间参数传来传去,麻烦不说,容易出错。Vuex就帮你解决这个问题。
Vuex是为开发大型单页应用(SPA)准备的,如果需要构建一个中大型单页应用,需要考虑如何在组件外管理状态,Vuex是不二之选。
总结: Vuex可以帮助我们管理共享状态,并附带了更多的概念和框架。
2、vuex 组成
-
vue脚手架自动创建内容
export default new Vuex.Store({ state: { //vuex状态,也就是数据。(不允许直接修改,只能读) }, mutations: { //修改,用于修改数据。 }, actions: { //action,用于操作mutations,运行发送ajax }, modules: { } })
2.1、State
Vuex 使用单一状态树——用一个对象就包含了全部的应用层级状态。 它作为唯一数据源而存在。每个应用将仅仅包含一个store实例。
单一状态树让我们能够直接地定位任一特定的状态片段。
个人理解:就相当于vue中data属性
使用
-
- 如何声明变量,用于储存数据
-
- 如何在其他组件中,使用vuex的数据
-
- 如何声明变量,用于储存数据
- 在store/index.js 文件的state区域声明变量
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { //状态,用于存放数据,类似data区域 count: 0 }, mutations: { }, actions: { }, modules: { } })
-
- 如何在其他组件中,使用vuex的数据
- this.$store 表示操作vuex
- this.$store.state 表示操作vuex的state区域
<script> export default { created() { //获得vuex中的数据 console.info( this.$store.state.count ) }, } </script>
2.2、Mutation
更改Vuex的store中的状态唯一方法是提交mutation。 Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
这个回调函数就是我们实际进行状态更改的地方,接收state作为第一个参数。
使用
-
- 如何在mutaions 定义函数,修改state的值
-
- 如何在其他组件中,执行mutations定义的函数
-
- 如何在mutations定义函数,修改state的值
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { //状态,用于存放数据,类似data区域 count: 0 }, mutations: { //声明 updateCount函数,修改count的值 updateCount(state, value) { state.count = value } }, actions: { }, modules: { } })
-
- 如何在其他组件中,执行mutaions定义的函数
-
this.$store 对vuex操作
-
this.$store.commit() 触发mutations定义函数
this.$store.commit("函数名",传递的值)
<script> export default { created() { //获得vuex中的数据 console.info( this.$store.state.count ) //修改vuex中的数据,通过mutations this.$store.commit('updateCount', 100) }, } </script>
2.3、Action
Action 类似于 mutation,不同在于:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
使用
-
- 如何在actions 定义函数
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { //状态,用于存放数据,类似data区域 count: 0 }, mutations: { //声明 updateCount函数,修改count的值 updateCount(state, value) { state.count = value } }, actions: { increment (context) { context.commit('increment') }, //执行异步操作 incrementAsync ({ commit }) { setTimeout(() => { commit('increment') }, 1000) }, //async/await async actionA ({ commit }) { commit('gotData', await getData()) }, async actionB ({ dispatch, commit }) { await dispatch('actionA') // 等待 actionA 完成 commit('gotOtherData', await getOtherData()) } } modules: { } })
-
- 如何在其他组件中,执行actions定义的函数
- 在组件中使用
this.$store.dispatch('xxx')
分发action - 使用
mapActions
辅助函数将组件的methods映射为store.dispatch
import { mapActions } from 'vuex' export default { // ... methods: { ...mapActions([ 'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')` // `mapActions` 也支持载荷: 'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)` ]), ...mapActions({ add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')` }) } }
3、实际操作
显示vuex中state的数据,点击"更改"通过vuex的mutaions改变
-
- store/index.js
-
- home页面显示count值,定义方法触发修改
4、vuex 的简化使用
- vuex提供mapState和mapMutaions对vuex操作进行简化
4.1、mapState 辅助函数
当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState
辅助函数帮助我们生成计算属性
对象展开运算符
mapState
函数返回的是一个对象。如何将它与computed
结合使用?有了对象展开运算符,我们可以极大地简化写法:
import { mapState } from 'vuex'
4.2、mapMutations 辅助函数
import { mapMutations } from 'vuex'