类似React Class组件的setState方法

hooks方便管理数据


/** 类似React Class组件的setState方法 */
export const useSet = (initState, merge = true) => {
  return useReducer((state, newState) => {
    if (merge) {
      return updateField(state, newState);
    }

    return { ...state, ...newState };
  }, initState);
};

function updateField(oldState, newState) {
  const result: any = { ...newState, ...oldState };
  for (let key in newState) {
    // 更新对象
    if (
      !isMoment(newState[key]) &&
      !isDayjs(newState[key]) &&
      typeOf(newState[key]) === 'object' &&
      Object.keys(newState[key])?.length
    ) {
      result[key] = updateField(oldState[key], newState?.[key]);
    } else if (Array.isArray(oldState[key])) {
      // 更新数组
      switch (typeof newState[key]) {
        case 'function':
          result[key] = newState[key](oldState[key]);
          break;
        default:
          result[key] = newState?.[key];
          break;
      }
    } else {
      // 更新其他数据类型
      result[key] = newState?.[key];
    }
  }

  return result;
}

function isMoment(obj) {
  return (
    obj &&
    typeof obj === 'object' &&
    typeof obj.format === 'function' &&
    typeof obj.add === 'function' &&
    typeof obj.subtract === 'function' &&
    typeof obj._isAMomentObject === 'boolean'
  );
}

function isDayjs(obj: any) {
  return obj && obj?.$d instanceof Date;
}

/**
 * 判断数据类型
 * @returns string\number\boolean\object\function\array\regexp
 */
export function typeOf(v) {
  return Object.prototype.toString.call(v).slice(8, -1).toLowerCase();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值