浅谈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 设计模式学习 Singleton
Jul 27 Javascript
学习ExtJS form布局
Oct 08 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
Nov 16 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
JavaScript实现刷新不重记的倒计时
Aug 10 Javascript
详解Nuxt.js部署及踩过的坑
Aug 07 Javascript
Vue.js实现可排序的表格组件功能示例
Feb 19 Javascript
详解async/await 异步应用的常用场景
May 13 Javascript
使用layui 的layedit定义自己的toolbar方法
Sep 18 Javascript
Vue获取页面元素的相对位置的方法示例
Feb 05 Javascript
微信小程序实现底部弹出框
Nov 18 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设计模式 Facade(外观模式)
2011/06/26 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
php动态函数调用方法
2015/05/21 PHP
php中smarty区域循环的方法
2015/06/11 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Python清空文件并替换内容的实例
2018/10/22 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
pygame实现成语填空游戏
2019/10/29 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
教师党员一句话承诺
2014/03/28 职场文书
学风建设演讲稿
2014/09/12 职场文书
单身证明范本
2015/06/15 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python