vuex-counter计数器

安装:npm install vuex --save

1,创建 store 对象--提供一个初始 state对象和一些 mutation

store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

//指定初始化数据
const state = { 
    count: 0
}

//mutations:对象,包含了n个直接更新状态的方法
const mutations = {
   ADD(state){
       state.count++;
   },
   CUT(state){
       state.count--;
   }
}

//actions:对象,包含了n个间接更新状态的方法
const actions = {
    add({commit}) {
        commit('ADD') //提交一个mutation请求
    },
    cut({commit}) {
        commit('CUT')
    },
    addIfOdd({commit,state}) {
        if (state.count % 2 != 0) {
            commit('ADD')
        }
    },
    addAsynce({commit},state) {
        setTimeout(()=>{
            commit('ADD')
        },1000)
    }
}

//getters:对象,包含多个getter计算属性
const getters = {
    evenOrOdd(state){ //当读取属性值时自动调用并返回属性值
        return state.count%2==0?'偶数':'奇数'
    }
}

export default new Vuex.Store({
    state,
    mutations,
    actions,
    getters
})

① state

提供一个初始 state对象

② mutations

每个mutation 都有一个字符串的 事件类型 和一个回调函数,这个回调函数就是我们实际进行状态更改的地方,并且它会接收一个 state 作为第一个参数。

当触发一个类型为 ADD 的 mutation 时(相应的 type 调用 store.comiit 方法),调用 ADD mutataion 的回调函数

③ actions

 actions: {
    increment (context) {
      context.commit('increment')
    }
  }

action 函数接收一个与 store 实例具有相同方法和属性的 context 对象,因此可以调用 context.commit 提交一个 mutation。

实践中,经常用到 ES2015 的参数解构来简化代码(特别是需要多次调用 commit  的时候)

actions: {
  increment ({ commit }) {
    commit('increment')
  }
}

④ getters

vuex 允许在 store 中定义 'getter',可以认为是 store 的计算属性,就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。

getter 接收 state 作为第一个参数。

2,在 Counter 组件中通过 store 对象读取数据

首先在入口文件 main.js 中注册 vuex 的 store

直接通过 state 和 getters 读取数据

通过 store.dispacth 方法 分发 action

完成 counter 计数器,在vuex 中可以监视 state 变更情况

辅助函数 maState ,mapGetters,mapActions

mapSate 辅助函数:mapState 函数返回的是一个对象,要将它与局部计算属性混合使用,可以使用对象展开运算符,要求映射的计算属性的名称与 state 的子节点名称相同,将 state 混入 computed 对象中

mapGetters 辅助函数:将 store 中的 getter 映射到局部计算属性,使用对象展开运算符将 getter 混入 computed 对象中

mapActions:将组件的 methods 映射为 store.dispatch 调用

原文地址:https://www.cnblogs.com/shanlu0000/p/13476832.html