浅谈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 相关文章推荐
JQuery实现用户名无刷新验证的小例子
Mar 22 Javascript
js实现的星星评分功能函数
Dec 09 Javascript
JS控制文本域只读或可写属性的方法
Jun 24 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
Jul 07 Javascript
浅谈JsonObject中的key-value数据解析排序问题
Dec 06 Javascript
Web安全之XSS攻击与防御小结
Dec 13 Javascript
10行代码实现微信小程序滑动tab切换
Dec 28 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 Javascript
JS操作json对象key、value的常用方法分析
Oct 29 Javascript
Vue-CLI与Vuex使用方法实例分析
Jan 06 Javascript
angular组件间传值测试的方法详解
May 07 Javascript
js实现删除json中指定的元素
Sep 22 Javascript
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模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
javascript Object与Function使用
2010/01/11 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
Python实现的Excel文件读写类
2015/07/30 Python
Python实现JSON反序列化类对象的示例
2018/01/31 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
css3 box-shadow阴影(外阴影与外发光)图示讲解
2017/08/11 HTML / CSS
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
新东网科技Java笔试题
2012/07/13 面试题
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
中华美德颂演讲稿
2014/05/20 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2014年应急工作总结
2014/12/11 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
质量承诺书格式范文
2015/04/28 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python