浅谈super-vuex使用体验


Posted in Javascript onJune 25, 2018

vuex与super-vuex

super-vuex是一套用于简化Vuex的数据架构。

适用场景

在繁重的中后台项目中,引入vuex的作用如下:

  1. 全局数据共享,组件数据逻辑解耦
  2. 数据业务接口分离
  3. 数据模块化管理,利于多人协作

super-vuex在这三种需求下都是和原生vuex的功能相同,在vuex原有功能上将mutation和action的定义和传导机制改良为函数的写法,在简易数组改动逻辑的使用上提供push、pop、shift、unshift、splice的方法,可以在与、组件中自动地完成mutation,以及数据引用的路径化,你可以通过load.allow去取到load模块下的allow属性。

使用体验

下面通过简单的demo比较下原生vuex和super-vuex使用细节上的不同。

一、状态模块化

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

Vuex:

const moduleA = {
 state: { ... },
 mutations: { ... },
 actions: { ... },
 getters: { ... }
}

const moduleB = {
 state: { ... },
 mutations: { ... },
 actions: { ... }
}

const store = new Vuex.Store({
 modules: {
  a: moduleA,
  b: moduleB
 }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

super-vue

自动将mutation逻辑执行,因此异步逻辑写在commit中即可,相比之下节省了代码量

import { ChildVuex } from "super-vuex";

const child = new ChildVuex('...');

child.value = { ... };

child.setCommit = {...};



const Main = new SuperVuex();

Main.setModule(child);

export default Main.init();

路径式获取子模块数据

数据路径,在之后的所有方法中,数据路径至关重要,它是一个数据的直观路径字符串,也就是上面[ChildVuex].value 数据定义的数据路径。

'load.allow'

可以取到load模块的allow属性

二、操作方法

super-vuex的操作方法上告别了以往同步数组操作的繁杂过程,比如在以往的vuex模式中实现一个对数组的操作是效率偏低的,先在mutation中定义方法操作,后在action中commit或是在组件中commit,super-vuex很好的解决了这个问题,提供了一系列基础的数组操作方法让你操作数组非常简单。

Vuex:

// 提交一个commit
store.commit({
 type: 'increment',
 amount: 10
})

mutations: {
 // push
 increment (state, n) {
  state.arr = = [...state.arr, n]
 }
 // pop
 popArr(state) {
   state.arr = arr.pop()
 }
 // shift
 shiftArr(state) {
   state.arr.shift()
 }
 // unshift
 unshift(state) {
   state.arr.unshift('students', {
    name: 'huaping1',
    age: 302
   })
 }
 // deleteStudent
 deleteStudent(state) {
  state.arr.splice('students', 0, 1);
 },
}
...

super-vuex:

super-vuex在commit这层提供了一系列的操作api,提高了数据传递的效率

child.setCommit('increment', (state, n) => {
    state.count += n;
});
changeName() {
  this.$store.user.commit('name', 'someone');
},
changeAllow() {
  this.$store.user.commit('load.allow', false);
  
},
pushStudent() {
  this.$store.user.push('students', {
    name: 'huaping',
    age: 300
  });
},
pushSubs() {
  this.$store.sub.push('subs', 10);
},
popSubs() {
  this.$store.sub.pop('subs');
},
unshiftStudent() {
  this.$store.user.unshift('students', {
     name: 'huaping1',
     age: 302
  });
},
shiftStudent() {
  this.$store.user.shift('students')
},
deleteStudent() {
  this.$store.user.splice('students', 0, 1);
},
gets() {
  his.$store.user.dispatch('load.data');
}

方法列表function

  1. get(name):获取一个getter属性;例:store.sub.get('subs')
  2. commit(name, data):提交处理一个属性;例:store.user.commit('age', data)
  3. push(name, ...data):提交一个数据的push行为
  4. pop(name):提交一个数据的pop行为
  5. unshift(name, ...data):提交一个数据的unshift行为
  6. shift(name): 提交一个数据的shift行为
  7. splice(name, arguments):用法同Array.prototype.splice
  8. dispatch(name, data):个async/await型的调用函数。与Vuex中的dispatch一致,用于出发setAction定义的行为

不仅如此,super-vuex还提供自定义模式可以覆盖掉默认给你提供的api,

child.setPushCommit(path, callback<(state, data)>);
child.setUnShiftCommit(path, callback<(state, data)>);
child.setPopCommit(path, callback<(state)>);
child.setShiftCommit(path, callback<(state)>);
  
// 注意splice使用方法,在`data`中是一个数组
child.setSpliceCommit(path, callback<(state, data)>);
  1. [ChildVuex].setPushCommit 数组的push操作行为
  2. [ChildVuex].setUnShiftCommit 数组的unshift操作行为
  3. [ChildVuex].setSpliceCommit 数组的splice操作行为
  4. [ChildVuex].setPopCommit 数组的pop操作行为
  5. [ChildVuex].setShiftCommit 数组的Shift操作行为

三、Getter

在组件内使用store中的数据,vuex通常是把getter放入computed中,使组件产生数据响应。

Vuex:

const store = new Vuex.Store({
 state: {
  todos: [
   { id: 1, text: '...', done: true },
   { id: 2, text: '...', done: false }
  ]
 },
 getters: {
  doneTodos: state => {
   return state.todos.filter(todo => todo.done)
  }
 }
})


// in component
computed: {
 // 使用对象展开运算符将 getter 混入 computed 对象中
  ...mapGetters([
   'doneTodosCount',
   'anotherGetter',
   // ...
  ])
 }

super-vuex:

this.store.doneTodos.get('todos')

非常简约地完成getter,响应式getter

当然想使用原生的getter也是OK的,辅助方法adjFunction(对ChildVuex自动生成的属性进行覆盖或自定义)

[ChildVuex].setGetter(path, cb)

自定义或覆盖模块中相应getter的属性,相当于原生vuex的getter属性。

覆盖原有的getter

child.setGetter('load.total', state => {
  return state.load.total + 100;
});
/* 调用$store.user.get('load.total') 
 * 返回 200
 */

@cevio github

@doc

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
可自定义速度的js图片无缝滚动示例分享
Jan 20 Javascript
javascript中setAttribute()函数使用方法及兼容性
Jul 19 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
微信小程序访问node.js接口服务器搭建教程
Apr 25 Javascript
移动端效果之Swiper详解
Oct 09 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
Aug 20 Javascript
vue基于element的区间选择组件
Sep 07 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
Sep 06 Javascript
JS实现json数组排序操作实例分析
Oct 28 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
Jun 25 #Javascript
使用vue的transition完成滑动过渡的示例代码
Jun 25 #Javascript
JS实现仿微信支付弹窗功能
Jun 25 #Javascript
vue.js 实现输入框动态添加功能
Jun 25 #Javascript
vue-router重定向不刷新问题的解决
Jun 25 #Javascript
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 #Javascript
详解React之父子组件传递和其它一些要点
Jun 25 #Javascript
You might like
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php安装swoole扩展的方法
2015/03/19 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
Python json模块使用实例
2015/04/11 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
flask session组件的使用示例
2018/12/25 Python
Python3中的bytes和str类型详解
2019/05/02 Python
python 获取等间隔的数组实例
2019/07/04 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
python和JavaScript哪个容易上手
2020/06/23 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
求职信内容怎么写
2014/05/26 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
大一学生个人总结
2015/02/15 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
新学期主题班会
2015/08/17 职场文书
微信早安问候语
2015/11/10 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
Python实战之OpenCV实现猫脸检测
2021/06/26 Python