浅谈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+Ajax+Json的高效分页实现代码
Oct 29 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
Jan 21 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
基于JQuery实现的Select级联
Jan 27 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
Javascript的表单验证长度
Mar 16 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
Nov 03 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
Dec 25 Javascript
微信小程序如何实现点击图片放大功能
Jan 21 Javascript
vue实现日历表格(element-ui)
Sep 24 Javascript
vue+springboot+element+vue-resource实现文件上传教程
Oct 21 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模板,主要想体现一下思路
2006/12/25 PHP
Redis构建分布式锁
2017/03/28 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python中文编码知识点
2019/02/18 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python英语单词测试小程序代码实例
2019/09/09 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
python GUI计算器的实现
2020/10/09 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
英国自行车商店:AW Cycles
2021/02/24 全球购物
《童年》教学反思
2014/02/18 职场文书
企业精神口号
2014/06/11 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis