【Vue学习总结】26.Vuex的重要属性之Getter、Action、Module

接上篇《25.Vuex介绍和实例演示

上一篇我们对vuex的基础和部分核心属性进行了介绍,本篇继续介绍vuex的其他重要属性,以及这些属性的实际应用。
本系列博文使用的Vue版本:2.6.11
vuex官方网站:https://vuex.vuejs.org/zh/

上一篇介绍了State和Mutation,本篇继续来说Getter、Action和Module。

一、Getter

官方网站对Getter的定义是store的计算属性,Getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
直白一点来说就是,Getter允许我们在改变数据的时候,做一些操作。

什么叫改变数据的时候做一些操作呢?例如state中有一个数据列表list,有时候我们需要根据条件过滤list,形成一个新的结果集以供用户查看,而这种处理结果多个组件之间可能都要使用,定义一个过滤函数,复制它到每一个组件,或者抽取到一个共享函数然后在每个组件导入它,都不是太理想。
这里我们使用getter这个共享状态处理对象,可以在任意组件直接调用它,在getter中定义的方法中的计算逻辑,会根据state中的值的变化而动态变化,简直不要太方便。这里我们写一个实例来让大家理解一下getter。
我们修改一下上一篇编写的store.js,增加一个Getter:

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
/**1.state在vuex中主要用于存储数据 */
var state={
    count:1
}
 
/**2.mutations里面放的是方法,主要用于改变state里面的数据 */
var mutations={
    incCount(){
        ++state.count;
    }
}

//定义Getter计算属性,改变state里面的count数据的时候,会触发getter里面的方法,获取新的值
var getters = {
    computedCount:(state,getters) => {
        return state.count*2;
    }
} 

//3.定义store
const store = new Vuex.Store({
    state,
    mutations:mutations,
    getters
})
 
//4.暴露store
export default store;

这里我们在getters里定义了一个getter,当上面state值改变的时候(mutation中的incCount方法一执行),就会触发getter的方法,这里的computedCount就会返回当前state中count最新的值乘以2的结果。然后我们在HelloWorld.vue中调用getter的方法,获取其计算的state中count最新的值乘以2的结果:

<template>
  <div id="app">
    首页<br/>
    State中的值【Count】:{
   
   {this.$store.state.count}} -- {
   
   {this.$store.gatters.computedCount}}
    <br/>
    <button @click="incCount()">增加数量</button>
    <router-view/>
  </div>
</template>

<script>
import store from '../vuex/store.js'
export default {
  name: 'app',
  data () {
      return {
        msg: '你好,vue'
      }
  },
  store,//这里如果store是其他名字,要写成store: store1
  methods:{
    incCount(){
        //改变vuex store里面的数据
        this.$store.commit('incCount');//触发mutations定义的方法
    }
  }
}
</script>
 
<style>
</style>

注意,上面的“{ {this.$store.gatters.computedCount}}”就是获取getter里的方法。效果:

可以看到,随着count的变化,相应的getter也被触发并更新的新的计算值。

总结一下,getter常用在state属性值动态计算结果且任意组件可直接获取的场景。


二、Action

根据官网介绍,Action类似于Mutation,他们的不同之处在于:
●Action提交的是Mutation,而不是直接变更状态
●Action可以包含任何异步操作。

说白了Action就是可以直接的操作Mutation,间接的改变State中的属性值,然后可以异步操作。这个属性很少使用到,这里简单介绍一下。我们编写实例来使用一下Action,在Store.js里继续定义action:

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
/**1.state在vuex中主要用于存储数据 */
var state={
    count:1
}
 
/**2.mutations里面放的是方法,主要用于改变state里面的数据 */
var mutations={
    incCount(){
        ++state.count;
    }
}

//定义Getter计算属性,改变state里面的count数据的时候,会触发getter里面的方法,获取新的值
var getters = {
    computedCount:(state,getters) => {
        return state.count*2;
    }
} 

//定义Action,用来异步操作Mutation
var actions={
    incMutationsCount(context){//这里的context是一个与store实例具有相同方法和属性的对象
        context.commit('incCount');//调用context.commit提交一个Mutation方法
    }
}

//3.定义store
const store = new Vuex.Store({
    state,
    mutations:mutations,
    getters,
    actions
})
 
//4.暴露store
export default store;

上面的Action函数的context参数,是一个与store实例具有相同方法和属性的对象,可以调用 context.commit提交一个mutation,或者通过context.state和context.getters来获取state 和getters。

然后在外部通过“dispatch”来触发action的方法:

this.$store.dispatch('incMutationsCount');

这里我们就不再做测试了,大家理解即可。

总结一下,Action常用在需要异步调用Mutation的方法时使用的。

三、Module

当我们把vue项目的所有状态全部维护至一个store对象中时,就可能导致store对象变得相当臃肿,为了解决以上问题,Vuex允许我们将store分割成模块(module)。每个模块拥有自己的state、mutation、action、getter甚至是嵌套子模块——从上至下进行同样方式的分割,例如:

const moduleA = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

这里面每个子模块调用的state默认都是自己本模块的state,如果getter需要调用根state和getter,在参数里添加rootState、rootGetters即可,同时action中可以通过context.rootState、context.rootGetters获取根的state和getter。

剩下的“命名空间”、“模块动态注册”和“模块重用”大家可以前往官网https://vuex.vuejs.org/zh/guide/modules.html详细学习,这里不再赘述。


四、总结

Vuex解决了vue中不同组件之间的数据共享,以及数据持久化的问题。

以上就是vue以及vuex的全部内容,至此vue的基础学习全部结束。请关注后续的vue项目实战的新专栏博文,感谢支持!

参考:
《IT营:itying.com-2018年Vue2.x 5小时入门视频教程》
转载请注明出处:https://blog.csdn.net/acmman/article/details/113814823

猜你喜欢

转载自blog.csdn.net/u013517797/article/details/113814823