tccc-vue-uikit
Version:
TCCC Vue3 UIKit
89 lines (82 loc) • 2.59 kB
text/typescript
import { TUIStoreType } from '../type';
import ITUIStore from '../interfaces/ITUIStore';
export default class TUIStore extends ITUIStore {
public store: TUIStoreType;
private storeListener: any;
constructor() {
super();
this.storeListener = {
keys: [],
// eslint-disable-next-line @typescript-eslint/no-empty-function
callback: () => {},
};
this.store = {};
const commonStore = {};
this.store.common = new Proxy(commonStore, {
get: (target:any, name:string) => target[name],
set: (target:any, name:string, value:any) => {
const oldValue:TUIStoreType = {};
Object.assign(oldValue, target);
// eslint-disable-next-line no-param-reassign
target[name] = value;
if (target[name] !== oldValue[name] && this.storeListener.keys.indexOf(name) >= 0) {
this.storeListener.callback(target[name], oldValue[name]);
}
return target[name];
},
});
}
/**
* 设置全局数据
*
* @param {any} store 设置全局的数据
* @returns {proxy} 设置完成的数据
*/
public setCommonStore(store: any) {
Object.keys(store).forEach((key: string) => {
if (key in this.store.common) {
return new Error(`${key} 在公共数据已存在,请重新设置`);
}
this.store.common[key] = store[key];
});
return this.store;
}
/**
* 挂载组件数据
*
* @param {string} TUIName 模块名
* @param {any} store 挂载的数据
* @param {callback} updateCallback 更新数据 callback
* @returns {proxy} 挂载完成的模块数据
*/
public setComponentStore(TUIName:string, store: any, updateCallback?: any) {
if (TUIName in this.store) {
return new Error(`${TUIName} 该数据模块已存在,请重新设置`);
}
return this.store[TUIName] = new Proxy(store, {
get: (target:any, name:string) => target[name],
set: (target:any, name:string, value:any) => {
const oldValue:TUIStoreType = {};
Object.assign(oldValue, target);
// eslint-disable-next-line no-param-reassign
target[name] = value;
if (target[name] !== oldValue[name]) {
updateCallback && updateCallback(target, oldValue);
}
return target;
},
});
}
/**
* 监听全局数据
*
* @param {Array} keys 需要监听的数据key
* @param {callback} callback 数据变化回调
*/
public storeCommonListener(keys:Array<string>, callback: any) {
this.storeListener = {
keys,
callback,
};
}
}