「vue 组件通信二」vuex状态管理

2018-12-04  本文已影响0人  ybrelax

前面一篇章介绍了组件的基本的通信,但是对于负责的项目来说还是略显单薄,所以今天再来介绍vue通信的另外一个重要角色 --- vuex
vuex 的存在主要是来解决非父子组件,兄弟组件所存在的缺陷。vuex主要的内容分为,state, mutations,actions, getters, modules

import Vue from 'vue';
import Vuex from 'vuex';
import mutations from './mutations'
import actions from './actions'
import getters from './getters'

Vue.use(Vuex);  //需要在这里注册然后才可以使用
const state = {
  count: 0,
  message: 'this is vuex'
}

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

state

这个属性主要的作用就是用来存储vuex管理的实例

const state = {
  count: 0,
  message: 'this is vuex'
}

mutaitions

要知道状态管理的属性(state)只能用来读取,而不能进行进修修改,只能通过mutatiosns来对它进行操作
mutaitions 就是对状态管理的属性进行一些修改操作(变更状态)

const mutations = {
  increment (state) {
    state.count++;
  }
}

export default mutations;

在vue中使用它

template:
      {{count}}
      <button @click = "increment"> 点我 +</button>
 computed: {
    count: function () {
      return this.$store.state.count
    }
  },
  methods: {
    increment () {
      this.$store.commit('increment') // 通过this.$store.commit方法来执行mutations
    }
  }

actions

actions和mutations很相似,不同在于action中可以提交mutations;
actions函数接收一个与store实例具有相同方法和属性的context对象; 因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

const actions = {
  incrementAction (context) {
    context.commit('increment');
  },

  asyncIncrement (context) {
    return new Promise(resolve => {
      setTimeout(() => {
        context.commit('increment');
        resolve();
      }, 1000);
    })
  }
}

export default actions;

如何去使用这个东西呢?

 incrementAction () {
      this.$store.dispatch('incrementAction')
    },
    asyncIncrementAction () {
      this.$store.dispatch('asyncIncrement').then(() => {
        console.log(this.$store.state.count);
      })
    }

getter

getters 和 vue 中的 computed 类似 , 都是用来计算 state 然后生成新的数据 ( 状态 ) 的。

export default {
 count (state, getters) { // 参数说明: arg1: state实例  arg2: 也可以是getters自身
   return state.count > 5 ? '傻瓜' : '很棒哦'
 }
}
countGetter: function () {
      return this.$store.getters.count
    }

modules

这个其实项目用得相对比较少,它是用来把store分割到不同的模块。但项目大的时候当个的store可能并不能满足业务需求,就有可能造成store过于庞大,所以就需要进行拆分,而modules正好可以派上用场。

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`'s state
store.state.b // -> `moduleB`'s state
上一篇下一篇

猜你喜欢

热点阅读