浅谈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 相关文章推荐
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
jquery可见性过滤选择器使用示例
Jun 24 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
Nov 07 Javascript
JS实现iframe自适应高度的方法示例
Jan 07 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
Jan 27 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
Nov 07 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 Echo字符串的连接格式
2016/03/07 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
三种检测iPhone/iPad设备方向的方法
2014/04/23 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
详解package.json版本号规则
2019/08/01 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
Python包和模块的分发详细介绍
2020/06/19 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
节水口号标语
2014/06/19 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
个人查摆剖析材料
2014/10/04 职场文书
领导干部作风建设总结
2014/10/23 职场文书
可可西里观后感
2015/06/08 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
MySQL的存储过程和相关函数
2022/04/26 MySQL