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();
}