useSetState 编写
useSetState 是通过 useState 编写的同类组件this.setState 功能相似的公共方法。(存在回调函数的区别,this.setState 第二个参数有回调);
import { useState } from 'react';
import _ from 'lodash';
type Patch<State> = (
patch: Partial<State> | ((prevPatch: State) => Partial<State>)
) => void;
type ExcludeT<State> = Exclude<Extract<State, object>, Function>;
export function useSetState<T>(initialState: ExcludeT<T>): [ExcludeT<T>, Patch<ExcludeT<T>>] {
if (!_.isPlainObject(initialState)) { // initialState && initialState.constructor === Object && Object.getPrototypeOf(initialState) === Object.prototype
throw new Error('state is not Plain Object');
}
const [state, setState] = useState(initialState);
const setUseState: Patch<ExcludeT<T>> = patch => setState(prevState => ({
...prevState,
...(patch instanceof Function ? patch(prevState) : patch)
}));
return [state, setUseState];
}