浅谈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 相关文章推荐
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
Jquery对数组的操作技巧整理
Mar 25 Javascript
调整小数的格式保留小数点后两位
May 14 Javascript
jQuery基础知识点总结(必看)
May 31 Javascript
JavaScript中日常收集常见的10种错误(推荐)
Jan 08 Javascript
BootStrapTable 单选及取值的实现方法
Jan 10 Javascript
图解Javascript——作用域、作用域链、闭包
Mar 21 Javascript
详解vue中computed 和 watch的异同
Jun 30 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
May 13 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
使用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在不同页面间传递Json数据示例代码
2013/06/08 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python中文件遍历的两种方法
2014/06/16 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python while 循环使用的简单实例
2016/06/08 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
python简单的三元一次方程求解实例
2020/04/02 Python
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
环境卫生标语
2014/06/09 职场文书
政协会议宣传标语
2014/10/09 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
大学班长竞选稿
2015/11/20 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书
Python 中的Sympy详细使用
2021/08/07 Python
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL