Vuex笔记

113 阅读2分钟

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,可以很方便集中管理给整个应用的所有组件的状态进行管理,并且有一套响应的规则来保证状态变化可以预测

Vuex状态管理流程

将State的状态绑定到组件,当用户在组件里发生交互,有状态变化时通过Dispatch来分发Actions,Actions不直接提交状态修改,可以通过Actions进行异步请求,再通过Commit提交到Mutation进行状态修改,通过Mutation进行状态可以很好地控制变化。

Vuex核心概念

Store  一个应用只有一个Store,是一个容器,包含应用的所有状态,不能直接修改

State  保存在Store中,维护状态,响应式的

Getter  计算属性,可以进行复杂的计算缓存

Mutation  修改状态必须通过Mutation

Action  可以进行异步操作

Moudule  状态过多不好管理,可以用Module将状态拆分为多个模块管理

使用Vuex

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {},
  mutations: {},
  actions: {},
  modules: {}
})

new Vue({
  store,
  render: h => h(App),
}).$mount('#app')

访问State

import { mapState } from 'vuex'
export default {
  computed: {
    // 相当于 count: state => state.count
    // 别名 ...mapState([ num: 'count', message: 'msg'])
    ...mapState(['count', 'msg'])
}

使用Getter

new Vuex.Store({
  getters: {
    reversMsg (state) {
      return state.msg.split('').reserse().join('')
    }
})


import { mapGetters } from 'vuex'
export default {
  computed: {
    ...mapGetters(['reversMsg'])
}

使用Mutation

new Vuex.Store({
  mutations: {
    increate (state, payload) {
      state.count += payload
    }
})


import { mapMutations } from 'vuex'
export default {
  methods: {
    ...mapGetters(['increate'])}

使用Action

new Vuex.Store({
  actions: {
    increateAsync (context, payload) {
      setTimeOut(() => {
         context.commit('increate', payload)
      }, 2000)
    }
})


import { mapAtions } from 'vuex'
export default {
  methods: {
    ...mapGetters(['increateAsync'])    

使用Module

// 每个module对应一个js文件
// js中都可以有 state、getters、mutations、actions
new Vuex.Store({
  modules: {
    // 导入模块
    products,
    cart
  }
})

// 开启命名空间
// 在每个module的export中 增加 namespaced: true
export default {
  namespaced: true
}

// 使用命名空间的数据
import { mapMutations } from 'vuex'
export default {
  methods: {
    //  第一个参数模块的名称 就是 导入模块时的名称
    ...mapGetters('products', ['increate'])
  }
}