浅谈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矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
Jan 09 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
Jan 24 Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
js+div实现文字滚动和图片切换效果代码
Aug 27 Javascript
js简单设置与使用cookie的方法
Jan 22 Javascript
JS简单去除数组中重复项的方法
Sep 13 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
Webpack 之 babel-loader文件预处理器详解
Mar 23 Javascript
js操作table中tr的顺序实现上移下移一行的效果
Nov 22 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
Jan 05 Javascript
js实现提交前对列表数据的增删改查
Jan 16 Javascript
JavaScript canvas动画实现时钟效果
Feb 10 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中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
js中开关变量使用实例
2017/02/24 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
python从入门到精通(DAY 1)
2015/12/20 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
新驾驶员个人自我评价
2014/01/03 职场文书
学生感冒英文请假条
2014/02/04 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
比赛主持人开场白
2015/05/29 职场文书
新教师教学工作总结
2015/08/14 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS