浅谈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 相关文章推荐
一个对于Array的简单扩展
Oct 03 Javascript
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
Dec 23 Javascript
IE6与IE7中,innerHTML获取param的区别
Mar 15 Javascript
使用JavaScript实现Java的List功能(实例讲解)
Nov 07 Javascript
javascript闭包入门示例
Apr 30 Javascript
JavaScript动态生成二维码图片
Apr 20 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
Dec 22 Javascript
js实现简单的碰壁反弹效果
Aug 30 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
Jun 19 Javascript
JavaScript引用类型Array实例分析
Jul 24 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
使用axios请求时,发送formData请求的示例
Oct 29 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
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
js图片处理示例代码
2014/05/12 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
Javascript必知必会(四)js类型转换
2016/06/08 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
2020/05/25 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
使用Python构建Hopfield网络的教程
2015/04/14 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
Python 随机按键模拟2小时
2020/12/30 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
性能服装:HYLETE
2018/08/14 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
八年级物理教学反思
2014/01/19 职场文书
校本教研活动总结
2014/07/01 职场文书
售房协议书
2014/08/19 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS