记录一些不经常使用的 hooks

useReducer 过于复杂的更改状态,可以使用 useReducer

  1. interface InitStateValue{
  2. num: number,
  3. hobby: object
  4. }
  5. const initialState : InitStateValue = {
  6. num: 18,
  7. hobby: {
  8. ball: 'football',
  9. eat: 'rice'
  10. }
  11. }
  12. const reducer = (state:InitStateValue, action:{type: string, value?: string}) => {
  13. switch(action.type){
  14. case 'numAdd':
  15. return {...state, num: state.num+1};
  16. case 'changeHobby':
  17. return {...state, hobby: {ball:'football', eat: action.value}}
  18. default:
  19. throw new Error();
  20. }
  21. }
  22. const Index: React.FC = () => {
  23. const[state, dispatch] = useReducer(reducer, initialState)
  24. const onInputChange = (e: React.MouseEvent<HTMLSpanElement>) => {
  25. e.persist()
  26. dispatch({type: 'changeHobby', value: e.target.value})
  27. }
  28. return (
  29. <>
  30. <p>age:{state.num}</p>
  31. {
  32. Object.keys(state.hobby).map(key=>{
  33. return <p>{`${key}:${state.hobby[key]}`}</p>
  34. })
  35. }
  36. <button onClick={() => {dispatch({type: 'numAdd'})}}>add</button>
  37. <input type="text" onChange={(e) => {onInputChange(e)}}/>
  38. </>
  39. );
  40. };

useCallback 和 useMemo 这两个hook可以进行性能优化,使用方法和useEffect有些类似,但是不能处理副作用。

useMemo : 只有count发生改变时,才会重新计算count , num 的改变不会引发 count 的重新计算

  1. const Index: React.FC = () => {
  2. const[count, setCount] = useState(0)
  3. const[num, setNum] = useState(0)
  4. let data = useMemo(() => {
  5. console.log('calculate执行')
  6. return count * 3
  7. },[count])
  8. return (
  9. <>
  10. <p>{data}</p>
  11. <p>num:{num}</p>
  12. <p>count:{count}</p>
  13. <button onClick={() => setNum(num+1)}>num add</button>
  14. <button onClick={() => setCount(count+1)}>count add</button>
  15. </>
  16. );
  17. };

useCallback useCallback的使用方法和useMemo类似,但是useCallback返回的是缓存的函数。

useCallback依赖count, 当count发生改变的时候,会返回一个新的函数,useCallback不依赖num,num发生改变的时候返回的是缓存的旧函数

  1. const Index: React.FC = () => {
  2. const[count, setCount] = useState(0)
  3. const[num, setNum] = useState(0)
  4. let data = useCallback(() => {
  5. console.log('calculate执行')
  6. return count * 3
  7. },[count])
  8. return (
  9. <>
  10. <p>{data}</p>
  11. <p>num:{num}</p>
  12. <p>count:{count}</p>
  13. <button onClick={() => setNum(num+1)}>num add</button>
  14. <button onClick={() => setCount(count+1)}>count add</button>
  15. </>
  16. );
  17. };

useCallback & useMemo 的关系
useCallback(fn, deps) === useMemo(() => fn, deps)

useRef 官方文档: https://zh-hans.reactjs.org/docs/hooks-reference.html#useref 可以存储任意javascript值而不仅仅是DOM引用