为什么用 useCallback

·

1 min read

别的文章讲,当将一个方法A作为prop传递给子组件的时候,假如不用useCallback,每次A都是新的,子组件接受新的方法A会重新渲染,这样导致了不必要的重复渲染。

在其他情况下,似乎没什么用处,比如下面这个情况

import { useCallback, useState } from "react"


const Counter = ()=> {
  const [count, setCount] = useState(0)
  // 每次都会执行,这种情况下 useCallback 似乎没什么用
  console.log(111);

  // const handleCount = ()=> {
  //   // react 状态更新是异步的,这么写不保证拿到最新值
  //   // setCount(count + 1)
  //   // 函数式写法可以保证拿到最新值
  //   setCount(prevCount => prevCount + 1) // 推荐这么写
  // }

  // const handleCount = useCallback(()=> {
  //   // react 状态更新是异步的,这么写不保证拿到最新值
  //   // setCount(count + 1)
  //   // 函数式写法可以保证拿到最新值

  //   // 推荐的做法是使用函数式更新,并将依赖项数组保持为空,
  // 以确保 handleCount 在整个组件生命周期内保持稳定。
  //   setCount(prevCount => prevCount + 1) // 推荐这么写
  // }, [])


  const handleCount = useCallback(() => {
    // react 状态更新是异步的,这么写不保证拿到最新值
    // setCount(count + 1)
    // 函数式写法可以保证拿到最新值

    // 假如用这种写法,依赖项count是要加的,
    //这样做的目的是count变化,handleCount重新创建,保证能取到最新的count值
    setCount(count + 1) 
  }, [count])


  return (
    <>
      <div>{count}</div>
      <button onClick={handleCount}>increaseCount</button>
    </>
  )
}

const App = () => {
  const [num, setNum] = useState(0)
  return (
    <>
      <div>{num}</div>
      <button onClick={()=> setNum((num) => num +1)}>increNum</button>
      <Counter></Counter>
    </>
  )
}

export default App