记录一些不经常使用的 hooks
useReducer 过于复杂的更改状态,可以使用 useReducer
interface InitStateValue{num: number,hobby: object}const initialState : InitStateValue = {num: 18,hobby: {ball: 'football',eat: 'rice'}}const reducer = (state:InitStateValue, action:{type: string, value?: string}) => {switch(action.type){case 'numAdd':return {...state, num: state.num+1};case 'changeHobby':return {...state, hobby: {ball:'football', eat: action.value}}default:throw new Error();}}const Index: React.FC = () => {const[state, dispatch] = useReducer(reducer, initialState)const onInputChange = (e: React.MouseEvent<HTMLSpanElement>) => {e.persist()dispatch({type: 'changeHobby', value: e.target.value})}return (<><p>age:{state.num}</p>{Object.keys(state.hobby).map(key=>{return <p>{`${key}:${state.hobby[key]}`}</p>})}<button onClick={() => {dispatch({type: 'numAdd'})}}>add</button><input type="text" onChange={(e) => {onInputChange(e)}}/></>);};
useCallback 和 useMemo 这两个hook可以进行性能优化,使用方法和useEffect有些类似,但是不能处理副作用。
useMemo : 只有count发生改变时,才会重新计算count , num 的改变不会引发 count 的重新计算
const Index: React.FC = () => {const[count, setCount] = useState(0)const[num, setNum] = useState(0)let data = useMemo(() => {console.log('calculate执行')return count * 3},[count])return (<><p>{data}</p><p>num:{num}</p><p>count:{count}</p><button onClick={() => setNum(num+1)}>num add</button><button onClick={() => setCount(count+1)}>count add</button></>);};
useCallback useCallback的使用方法和useMemo类似,但是useCallback返回的是缓存的函数。
useCallback依赖count, 当count发生改变的时候,会返回一个新的函数,useCallback不依赖num,num发生改变的时候返回的是缓存的旧函数
const Index: React.FC = () => {const[count, setCount] = useState(0)const[num, setNum] = useState(0)let data = useCallback(() => {console.log('calculate执行')return count * 3},[count])return (<><p>{data}</p><p>num:{num}</p><p>count:{count}</p><button onClick={() => setNum(num+1)}>num add</button><button onClick={() => setCount(count+1)}>count add</button></>);};
useCallback & useMemo 的关系useCallback(fn, deps) === useMemo(() => fn, deps)
useRef 官方文档: https://zh-hans.reactjs.org/docs/hooks-reference.html#useref 可以存储任意javascript值而不仅仅是DOM引用
