vuex学习笔记

什么是vuex?
vuex是一个专门为vue.js设计的集中式状态管理架构,关于状态的理解就是在data中的属性需要共享给其他vue组件使用的部分。
vuex组成:state(存放的数据状态)、getters(对state中的状态进行过滤处理)、mutations(写有修改数据的逻辑)、actions(提交的是mutation,而不是直接变更状态)。

以下是各个模块的具体介绍:

state
vuex提供一个仓库,state用来存放数据源,对应于一般vue对象里面的data(还有对应于actions和mutations对应于methods)。

响应式存储:state里面存放的数据是响应式的,vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新。

局部状态:(1)获取:在vue组件中获取数据最直接的方式是通过计算属性中获取。(2)组件仍然可以保存局部状态:可以把state放在组件自身,作为局部数据,专供此组件使用。

mapState(不是很懂??)
mapState的作用是把全局的state和getters映射到当前组件的computed计算属性中,this.$store.state。
使用方法:

import {mapState} from 'vuex'
export default{
  computer:
  mapState({
   count:state=>state.count,
     'count' //映射this.count为store.state.count
   })
}

getters
在store仓库中,state用来存放数据,如果要对数据进行处理输出,可以写到计算属性中,当很多组件都需要使用处理后的数据,我们就可以把数据抽离出来共享,这就是getters存在的意义。
使用方法:在store中定义getters,第一个参数是state

const getter={style:state=>state.style}

使用方法:

computed:{
  doneTodosCount(){
     return this.$store.getters.doneTodosCount}
}

mutation
vuex中store数据改变的唯一方法是mutation。通俗的理解就是mutations里面装着一些改变数据方法的集合,把处理数据逻辑方法放在mutations里面,使得数据和视图分离。
使用方法:
mutations结构:每个mutation都有一个字符串类型的事件类型(type)和回调函数(handler),首先注册事件,当触发响应类型的时候调用handler(),调用type的时候需要用到store.commit()方法。

const store=new Vuex.Store({
   state:{
     count:1
     },
   mutations:{
      increment(state){
         state.count++}
    }
  })

store.commit('increment')//调用type,触发handler(state)

commit:提交可以在组件中使用this.$store.commit('xxx')提交mutation。

action
action提交的是mutation,而不是直接变更状态;action可以包含任意异步操作。它可以理解为通过将mutations里面处理数据的方法变成可异步的处理数据的方法,但还是通过mutation来操作。
使用:定义actions

const store=new Vuex.Store({
  state:{
    count:0
  },
  mutations:{
    increment(state){
       state.count++;
    }
 },
 actions:{
   increment(context){
     context.commit('increment')
   }
 }
})

module
module可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。
怎么用module?

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

关于命名空间:如果想要模块具有更高的封装度和复用性,可以通过添加namespaced:true的方式使其成为带命名空间的模块。

相关推荐