ice中redux转useState

背景:由于业务变更需要将业务组件抽离成公共业务组件

转换方式

// 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];
    },
  });
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值