使用

安装

npm i super-vuex

使用

SuperVuex

初始化

import { SuperVuex } from 'super-vuex';
const Main = new SuperVuex('NameSpace');

参数为命名空间,可不传

[SuperVuex].setModule

装载一个业务模块(module模块)。

该模块必须继承自ChildVuex。

import UserStore from './store/user';
import CompanyStore from './store/company';
Main.setModule(UserStore, CompanyStore, ...);

[SuperVuex].setPlugin

增加额外的插件供使用,插件也是纯Vuex支持的插件。

Main.setPlugin(MyPlugin_1, Myplugin_2, ...);

[SuperVuex].init

用于初始化整个数据结构,同时返回纯原生的new Vuex.Store对象。可以在Vue文件中直接使用该返回对象。

export default Main.init();

[SuperVuex].$connect.registerModule

在实例SuperVuex.init执行之后,动态注入module模块

Main.$connect.registerModule(A:ChildVuex, B:ChildVuex, C:ChildVuex, ...);

[SuperVuex].$connect.unregisterModule

在实例SuperVuex.init执行之后,解注module模块

Main.$connect.unregisterModule(a:ChildVuex.namespace,b:ChildVuex.namespace,c:ChildVuex.namespace, ...);

ChildVuex

主要用于业务逻辑数据模块化(相当于vuex中module中的模块)。它与SuperVuex相似,只有一个参数即命名空间。

import { ChildVuex } from "super-vuex";
const child = new ChildVuex('user');
export default child;

[ChildVuex].value

  • getter:value 获取整个Vuex初始化配置参数。一般不需要用到这个属性(由系统自动调用)。
  • setter:value 定义整个模块的数据初始化内容。
child.value = {
  name: 'evio',
  age: 18,
  students: [
    {
      name: 'yixianle',
      age: 10
    }
  ],
  load: {
    allow: true,
    data: {},
    total: 100
  }
}

你也可以通过setState方法来设置一个数据树

child.setState({
  name: 'evio',
  age: 18
})

setState方法等同于value的setter方法。

ChildVuex data path

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

比如我们需要获取allow的路径:

'load.allow'

ChildVuex只对Object类型进行深度路径处理,一旦遇到非object类型,路径就停止跟踪。数组虽然属于object类型,但是它在这里也是停止跟踪的。比如

'students'

操作方法

调用语法

  import store from './store';
  /*
   *store:super-vuex在调用init后生成的实例;
   *namespace:module的命名空间;
   *function:需要调用的方法;
   *arguments:参数
  */
  store[namespace][function](arguments)

方法列表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定义的行为

辅助方法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
     */

自定义新的getter

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

[ChildVuex].setCommit

自定义或覆盖模块中相应的commit属性,相当于Vuex中的commit。

覆盖式

    child.setCommit('load.total', (state, data) => {
        state.load.total = state.load.total+data+100;
    });

自定义

    child.setCommit('myNewPath', (state, data) => {
        state.name = 'data';
    });
    /* 调用$store.user.commit('myNewPath', 'yixianle') 
     * user中的'name'改为'yixianle'
     */

[ChildVuex].set{ArrayAction}Commit

自定义或覆盖数组的commit操作。

  • [ChildVuex].setPushCommit 数组的push操作行为
  • [ChildVuex].setUnShiftCommit 数组的unshift操作行为
  • [ChildVuex].setSpliceCommit 数组的splice操作行为
  • [ChildVuex].setPopCommit 数组的pop操作行为
  • [ChildVuex].setShiftCommit 数组的Shift操作行为
    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].setAction

设定Vuex的自定义行为,由dispatch触发。

    child.setAction('load.data.fetch', async () => {
      const res = await axios.get('https://registry.npm.taobao.org/');
      child.commit('load.data', res.data);
    });