浅谈Vuex@2.3.0 中的 state 支持函数申明


Posted in Javascript onNovember 22, 2017

vuex 2.3.0 的发布说明: Modules can now declare state using a function - this allows the same module definition to be reused (e.g. multiple times in the same store, or in multiple stores)

假如你 vuex 的模块有多个格式是完全一样的, 这时候就可以把这个模块公共出来, 在 Vuex 实例里引用, 如:

import api from '~api'

const actions = {
  async ['get']({commit, rootState: {route: { path }}}, config = {}) {
    const { data: { code, data } } = await api.post(config.url, config.data)
    if (code === 1001) commit('receive', data)
  }
}

const mutations = {
  ['receive'](state, data) {
    state.data = [].concat(data)
  },
  ['modify'](state, payload) {
    const index = state.data.findIndex(item => item.id === payload.id)
    if (index > -1) {
      state.data.splice(index, 1, payload)
    }
  },
  ['insert'](state, payload) {
    state.data = [payload].concat(state.data)
  },
  ['remove'](state, id) {
    const index = state.data.findIndex(item => item.id === id)
    state.data.splice(index, 1)
  }
}

const getters = {
  ['get'](state) {
    return state.data
  }
}
export const _actions = actions
export const _mutations = mutations
export const _getters = getters
export default {
  namespaced: true,
  actions,
  mutations,
  getters
}
import Vue from 'vue'
import Vuex from 'vuex'

import lists from './general/lists'

Vue.use(Vuex)

export default new Vuex.Store({
  namespaced: true,
  modules: {
    base: {
      namespaced: true,
      modules: {
        app: {...lists, state: { lists: { data: [], total: 0, current_page: 1 } }},
        platform: {...lists, state: { lists: { data: [], total: 0, current_page: 1 } }},
        product: {
          namespaced: true,
          modules: {
            category: {...lists, state: { lists: { data: [], total: 0, current_page: 1 } }},
          }
        },
        keyword: {
          namespaced: true,
          modules: {
            username: {...lists, state: { lists: { data: [], total: 0, current_page: 1 } }},
          }
        },
      }
    },
    buzz: {
      namespaced: true,
      modules: {
        shop: {...lists, state: { lists: { data: [], total: 0, current_page: 1 } }},
      }
    }
})

但是 state 却需要每个单独设置, 如果直接设置在lists里, 会导致 state 对象被引用共享

在 vuex@2.3.0 中, 这个问题将不存在

import api from '~api'

const actions = {
  async ['get']({commit, rootState: {route: { path }}}, config = {}) {
    const { data: { code, data } } = await api.post(config.url, config.data)
    if (code === 1001) commit('receive', data)
  }
}

const mutations = {
  ['receive'](state, data) {
    state.data = [].concat(data)
  },
  ['modify'](state, payload) {
    const index = state.data.findIndex(item => item.id === payload.id)
    if (index > -1) {
      state.data.splice(index, 1, payload)
    }
  },
  ['insert'](state, payload) {
    state.data = [payload].concat(state.data)
  },
  ['remove'](state, id) {
    const index = state.data.findIndex(item => item.id === id)
    state.data.splice(index, 1)
  }
}

const getters = {
  ['get'](state) {
    return state.data
  }
}
export const _actions = actions
export const _mutations = mutations
export const _getters = getters
export default {
  namespaced: true,
  state() {
    return { lists: { data: [], total: 0, current_page: 1 } }
  },
  actions,
  mutations,
  getters
}
import Vue from 'vue'
import Vuex from 'vuex'

import lists from './general/lists'

Vue.use(Vuex)

export default new Vuex.Store({
  namespaced: true,
  modules: {
    base: {
      namespaced: true,
      modules: {
        app: lists,
        platform: lists,
        product: {
          namespaced: true,
          modules: {
            category: lists,
          }
        },
        keyword: {
          namespaced: true,
          modules: {
            username: lists,
          }
        },
      }
    },
    buzz: {
      namespaced: true,
      modules: {
        shop: lists,
      }
    }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
非阻塞动态加载javascript广告实现代码
Nov 17 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
Feb 10 Javascript
Javascript中实现String.startsWith和endsWith方法
Jun 10 Javascript
JavaScript实现的MD5算法完整实例
Feb 02 Javascript
微信小程序 支付功能实现PHP实例详解
May 12 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
JavaScript实现简单动态进度条效果
Apr 06 Javascript
JS多个异步请求 按顺序执行next实现解析
Sep 16 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
微信小程序8种数据通信的方式小结
Feb 03 Javascript
javascript实现贪吃蛇小游戏
Jul 28 Javascript
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
echarts学习笔记之图表自适应问题详解
Nov 22 #Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
Nov 22 #Javascript
在vue中添加Echarts图表的基本使用教程
Nov 22 #Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
Nov 22 #Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
Nov 22 #Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
Nov 22 #Javascript
浅谈Angular 中何时取消订阅
Nov 22 #Javascript
You might like
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
PHP IE中下载附件问题解决方法
2014/01/07 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python使用psutil模块获取系统状态
2016/08/27 Python
用Python设计一个经典小游戏
2017/05/15 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
Canvas 文本填充线性渐变的使用详解
2020/06/22 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
社区居务公开实施方案
2014/03/27 职场文书
个人投资合作协议书
2014/10/12 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android