【VUEX】state、mutations、actions、getters、modules以及辅助函数mapState和mapGetters

Vuex是一个用于管理Vue应用状态的库,它提供了state、mutations、actions、getters和modules等核心属性,以及mapState和mapGetters辅助函数,便于组件与全局状态交互。通过commit来同步改变state,actions处理异步操作,而modules则支持模块化,提升应用的可维护性。

Vuex

简介:vuex是vue.js的状态管理库

提供一种集中式存储管理应用程序中的所有组件的状态,并将其分离到一个可预测的状态容器中。

五个核心属性:state、mutations、actions、getters、modules
属性作用
state存放状态(数据),所有组件共享
mutations唯一可以修改state的地方,改变state状态需要通过显示地commit(提交)mutation(同步)
actions用于异步操作提交mutations,根据后端接口返回数据去commit更新数据
getters获取state中的状态
modules将store分割成模块,每个模块都拥有自己的state、mutation、action、getters和子模块,以便提高应用程序的可维护性
两个辅助函数:mapState、mapGetters
属性作用用法
mapState将 store 中的 state 映射到局部计算属性computed: {…mapState([‘count’, ‘xx’]),}
mapGetters将 store 中的 getter 映射到局部计算属性computed: {…mapGetters([‘count’, ‘xx’]),}

当一个组件需要获取多个状态的时候,可以使用 mapState或mapGetters 辅助函数帮助我们生成计算属性,减少冗余代码:

// store 中的 state、getter 映射到局部计算属性
import { mapState, mapGetters } from 'vuex'; 
computed: {
  // 使用对象展开运算符将此对象混入到外部对象中
  ...mapState(['count']),
  ...mapGetters(['count']),
  localComputed () { /* ... */ },
}

可以通过 this.$store 访问store实例,从Store中读取state(状态),改变state状态需要通过显示地commit(提交)mutation;

//当有modules模块化时要注意提交commit需要加上文件名
this.$store.commit('app/SET_COUNT', 10)
Vuex中,States、MutationsGettersActionsModules这五个模块各自有着不同的用途特点: ### States States是数据源的载体,用于保存所有的全局变量,是整个应用的单一状态树,应用中的所有状态都集中存放在这里。在应用变得复杂时,状态会集中到一个较大的对象中。例如在定义一个store时,可以这样设置state: ```javascript const store = new Vuex.Store({ state: { count: 0 } }) ``` 这里的`count`就是一个全局变量,保存在state中 [^1][^2]。 ### Mutations Mutations是唯一可以提交并改变state状态(即数据的属性值)的方式,它通过直接改变状态来修改state,并且必须同步执行。Mutations相当于生成了修改全局变量的事件函数,需要通过事件驱动来触发。例如: ```javascript const store = new Vuex.Store({ state: { count: 0 }, mutations: { add(state, step) { // 参数1: 上面的state 参数2: 组件传过来的参数 state.count += step } } }) ``` 在这个例子中,`add`就是一个mutation函数,用于增加`count`的值 [^1][^2]。 ### Getters Getters用于对state中的数据派生出一些状态,例如对数据进行过滤。它会对state中的变量进行过滤后再保存,只要state中的变量发生改变,它也会相应改变,而在state未变化时,使用的是缓存。Getters只会读取state中的数据,不会修改。例如: ```javascript const store = new Vuex.Store({ state: { numbers: [1, 2, 3, 4, 5] }, getters: { evenNumbers: state => state.numbers.filter(num => num % 2 === 0) } }) ``` 这里的`evenNumbers`就是一个getter,用于获取`numbers`数组中的偶数 [^1]。 ### Actions Actions类似于Mutation,但不同的是,Action提交的是mutation,而不是直接变更状态。Action可以包含任意的异步操作。Action接受一个与store实例具有相同方法属性的context对象,里面有`commit`方法`state`属性等。触发action需要通过`store.dispatch`方法。例如: ```javascript const store = new Vuex.Store({ state: { token: null }, mutations: { updateToken(state, payload) { state.token = payload } }, actions: { getAsyncToken(context, params) { setTimeout(() => { context.commit('updateToken', params) }, 1000) } } }) ``` 在这个例子中,`getAsyncToken`是一个action,它在异步操作(这里是`setTimeout`)完成后提交了`updateToken`这个mutation [^1][^3]。 ### Modules 由于使用单一状态树,应用的状态会集中到一个比较大的对象中,当应用变得非常复杂时,store对象可能会变得相当臃肿。为解决这个问题,Vuex允许将store分割成模块(Module),每个模块拥有自己的state、mutation、action、getter,甚至可以嵌套子模块。需要注意的是,modules模块中的state不能通过`this.$store.state`直接获取,必须加上module的命名空间,但gettersmutations能正常使用。例如: ```javascript // user.js export default { namespaced: true, state: { token: '12345', test: '啦啦啦' }, getters: { addStr: state => state.token + state.test, otherAddStr: state => state.test + state.token }, mutations: { updateToken(state, payload) { state.token = payload }, resetToken(state) { state.test = '重置后' } }, actions: { getAsyncToken(context, params) { setTimeout(() => { context.commit('updateToken', params) }, 1000) } } } ``` 在主store中引入这个模块: ```javascript import user from './user.js' const store = new Vuex.Store({ modules: { user } }) ``` 要获取`user`模块的state,需要使用`this.$store.state.user.token` [^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值