vuex中state,getter,mutation,action,module的用法与理解

一.
State:{
count: 0
}
保存着所有的全局变量
组件中获取:

computed:{
    ...mapState({ //es6的对象展开运算符
        count: state => state.count //es6箭头函数
        'count' //如果名字与state中的名字一致,可这样简写
    })
}

二.
Getter: 对state中的数据派生出一些状态,例如对数据进行过滤。(可以认为是store中的计算属性),会对state中的变量进行过滤再保存,只要state中的变量发生了改变,它也会发生变化,不变化的时候,读的缓存。

getters: {
   doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    doneTodosCount: (state, getters) => { //Getter 也可以接受其他 getter 作为第二个参数:
    return getters.doneTodos.length
  }
 }

在组件中的用法(mapGetters 辅助函数):

 computed: {
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodosCount', //如果想改名称,可以用对象的方式doneCount: 'doneTodosCount'
      'anotherGetter',
      // ...
    ])
  }

三.
Mutation:
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。
一条重要的原则就是要记住 mutation 必须是同步函数。

mutations: {
  increment (state, n) {
    state.count += n
  }
}
 methods: {
    ...mapMutations([
      'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`

      // `mapMutations` 也支持载荷:
      'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
    ]),
    ...mapMutations({
      add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
    })
  }

四.
Action:
Action 类似于 mutation, 不同点在于,Action 提交的是 mutation,而不是直接变更状态。Action 可以包含任意异步操作,mutation只能是同步。
有点不同的是Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

 mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: { //action 异步请求到数据后,用mutations中的方法传参到函数中,在函数中去改变state中的变量。
    increment (context) {
      context.commit('increment')
    }
  }

最后,如果我们利用 [async / await],我们可以如下组合 action:

actions: {
  async actionA ({ commit }) { //commit为触发mutations中的函数的方法,用到了es6的参数解构。
    commit('gotData', await getData())  
  },
  async actionB ({ dispatch, commit }) {
    await dispatch('actionA') // 等待 actionA 完成  actions中的方法通过dispatch()触发
    commit('gotOtherData', await getOtherData())
  }
}

五.
Module: // 如下类似这样的模块,可以写很多,最后都引入到一个文件。分散管理。

import * as types from '../mutations-type' //变更为常量名,有利于项目的理解。如:export const SOME_MUTATION = 'someMutation'

const state = {
    responseData: '', // 响应数据
    memoryKey: '' //内存地址的id
}

// getters
const getters = {
    msgShow: state => state.msgShow,
    noDataShow: state => state.noDataShow
}

// actions
const actions = {
    getDetailData(context, payload) {
        EMAjax.get({
            url: payload.url,
            data: payload.data,
            beforeSend: function() {
                state.responseData = ''; // 数据请求前先初始化
            },
            success: function(response) {
            },
            error: function(err) {} {
        })
    },
    // 调用终端方法 将数据保存到终端内存中 并返回内存地址的id 有返回值 返回值int 
    terminalSaveString(context, payLoad) {
        context.commit(types.TERMINAL_SAVE_STRING, payLoad);
    },
}

// mutations
const mutations = {
    [types.GET_DETAIL_DATA](state, { data }) { 
        if (data.records.length > 0) {
            state.responseData = data;
        } else {
            state.isShowMsg = true;
        }
    },
    // 调用终端方法 将数据保存到终端内存中 并返回内存地址的id 有返回值 返回值int 
    [types.TERMINAL_SAVE_STRING](context, payLoad) {
        state.memoryKey = EMTerminal.terminalInsertMemory(payLoad);
    },
}

export default {
    namespaced: true,   //namespaced: true 的方式使其成为带命名空间的模块。保证在变量名一样的时候,添加一个父级名拼接。
    state,
    getters,
    actions,
    mutations
}

生成实例的时候 都放在Store的modules中
export default new Vuex.Store({
modules: {
globalInputBox,
globalMenu,
searchDetail,
searchDetailAll,
searchDetailQuota,
searchDetailBlocks,
searchDetailFunction,
searchDetailSecurity,
searchDetailSpecial,
searchDetailNews,
searchDetailNotice,
searchDetailReports,
searchDetailLaws
}
});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 3,052评论 0 7
  • Vuex 是什么? ** 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式**。它采用集中...
    Rz______阅读 2,361评论 1 10
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,167评论 4 111
  • 上一章总结了 Vuex 的框架原理,这一章我们将从 Vuex 的入口文件开始,分步骤阅读和解析源码。由于 Vuex...
    你的肖同学阅读 1,896评论 3 16
  • Vuex 的学习记录 资料参考网址Vuex中文官网Vuex项目结构示例 -- 购物车Vuex 通俗版教程Nuxt....
    流云012阅读 1,554评论 0 7

友情链接更多精彩内容