标签:const mutations ice transform next state useState import redux
背景:由于业务变更需要将业务组件抽离成公共业务组件
转换方式
// import store from '../../store'
// const [state, stateDispatcher] = store.useModel('advance');
import { transform } from './transform';
import models from './models';
const [state, stateDispatcher] = transform(models, 'advance');
transform.ts
import { useState } from 'react';
import { cloneDeep } from 'lodash';
interface ModelType {
state: any;
reducers?: object;
effect?: () => {};
[propName: string]: any;
}
export function transform(model: ModelType, nameSpace?: string) {
// eslint-disable-next-line react-hooks/rules-of-hooks
const { state, reducers, effects } = model;
// eslint-disable-next-line react-hooks/rules-of-hooks
const [_state, _stateDispatcher] = useState(state);
const _mutations = {};
// eslint-disable-next-line guard-for-in
for (const rdc in reducers) {
_mutations[rdc] = function (payload) {
const newState = cloneDeep(_state);
reducers?.[rdc]?.(newState, payload);
if (JSON.stringify(newState) !== JSON.stringify(_state)) _stateDispatcher(newState);
};
}
if (nameSpace) {
_mutations[nameSpace] = _proxy(_mutations);
}
const _actions = effects(_mutations);
const initProxy = {
..._mutations,
..._actions,
};
const _dispatcher = _proxy(initProxy);
return [_state, _dispatcher];
}
// transfer target access to source
function _proxy(sourceObj) {
// eslint-disable-next-line no-param-reassign
return new Proxy(sourceObj, {
get(target, propKey, receiver) {
return Reflect.get(sourceObj, propKey, receiver);
},
set(target, propKey) {
return target[propKey];
},
});
}
标签:const,mutations,ice,transform,next,state,useState,import,redux 来源: https://blog.csdn.net/riddle1981/article/details/120910668
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。