浅谈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 得到变量类型的函数
May 19 Javascript
jQuery下的动画处理总结
Oct 10 Javascript
jquery 取子节点及当前节点属性值
Jul 25 Javascript
使用js dom和jquery分别实现简单增删改
Sep 11 Javascript
jQuery+AJAX实现网页无刷新上传
Feb 22 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
Aug 12 Javascript
老生常谈jacascript DOM节点获取
Apr 17 Javascript
Javascript中click与blur事件的顺序详析
Apr 25 Javascript
JavaScript 中调用 Kotlin 方法实例详解
Jun 09 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
Vue-cli创建项目从单页面到多页面的方法
Sep 20 Javascript
JavaScript实现网页下拉菜单效果
Nov 20 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
如何选购合适的收音机
2021/03/01 无线电
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
收集json解析的四种方法分享
2014/01/17 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
js带闹铃功能的倒计时代码
2016/09/29 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
canvas知识总结
2017/01/25 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
Python网络爬虫实例讲解
2016/04/28 Python
Python随机生成手机号、数字的方法详解
2017/07/21 Python
Python编程实现蚁群算法详解
2017/11/13 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
python获取酷狗音乐top500的下载地址 MP3格式
2018/04/17 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
日语求职信范文
2013/12/17 职场文书
2014年创卫工作总结
2014/11/24 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
心理学培训心得体会
2016/01/22 职场文书