vuex与super-vuex
super-vuex是一套用于简化Vuex的数据架构。
适用场景
在繁重的中后台项目中,引入vuex的作用如下:
- 全局数据共享,组件数据逻辑解耦
- 数据业务接口分离
- 数据模块化管理,利于多人协作
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
- get(name):获取一个getter属性;例:store.sub.get('subs')
- commit(name, data):提交处理一个属性;例:store.user.commit('age', data)
- push(name, ...data):提交一个数据的push行为
- pop(name):提交一个数据的pop行为
- unshift(name, ...data):提交一个数据的unshift行为
- shift(name): 提交一个数据的shift行为
- splice(name, arguments):用法同Array.prototype.splice
- 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)>);
- [ChildVuex].setPushCommit 数组的push操作行为
- [ChildVuex].setUnShiftCommit 数组的unshift操作行为
- [ChildVuex].setSpliceCommit 数组的splice操作行为
- [ChildVuex].setPopCommit 数组的pop操作行为
- [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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】