浅谈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 相关文章推荐
使用javascipt---实现二分查找法
Apr 10 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
May 15 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
Jun 24 Javascript
jquery实现点击变换导航样式的方法
Aug 31 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
深入探讨Vue.js组件和组件通信
Sep 12 Javascript
javascript设置文本框光标的方法实例小结
Nov 04 Javascript
js微信分享实现代码
Oct 11 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
Apr 19 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
django js 实现表格动态标序号的实例代码
Jul 12 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调用Google translate_tts api实现代码
2013/08/07 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
js的三种继承方式详解
2017/01/21 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
Python ljust rjust center输出
2008/09/06 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
python的concat等多种用法详解
2018/11/28 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
代码详解django中数据库设置
2019/01/28 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
几道PHP面试题
2013/04/14 面试题
性能测试工程师的面试题
2015/02/20 面试题
学生会招新策划书
2014/02/14 职场文书
党支部半年考察意见
2015/06/01 职场文书
《迟到》教学反思
2016/02/24 职场文书
python如何做代码性能分析
2021/04/26 Python
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android