You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中count引发重渲染时,useCallback包裹的回调是否重建?

useCallback 组件重渲染时的回调重建问题分析

示例代码

const App = () => {
   const [name,setName] = useState('')
   const [count,setCount] = useState(0)
   const fn = useCallback(() => {
      console.log("I'm a callback")
   },[name])
   return <div onClick = {() => setCount(count => count + 1)}>{count}</div>
}

问题与选项

当count变化引发组件重渲染时,被useCallback包裹的回调函数是否会被重建?以下哪种情况符合实际?

    1. 当重渲染由count变化引发时,回调永远不会被重建,fn始终是最初的回调本身。
    1. 只要组件发生重渲染,回调就会被重建。重渲染意味着App函数被再次调用,代码会重新执行,因此每次重渲染都会生成新的回调函数。但由于依赖项name未发生变化,useCallback Hook仍会返回之前的回调。

结论与解释

正确答案是选项2。

组件重渲染的本质是函数组件的函数体被重新执行,所以每次重渲染时,useCallback内部定义的箭头函数都会被全新创建。但useCallback的核心作用是缓存回调引用:当依赖数组中的值未发生变化时,它会返回上一次缓存的旧回调函数,而非本次新建的函数。只有当依赖项更新时,useCallback才会替换缓存,返回新创建的回调。

在这个示例中,count变化触发重渲染时,虽然每次都会生成新的回调函数,但因为name始终未变,useCallback会返回之前缓存的旧回调,所以fn的引用保持不变。

内容的提问来源于stack exchange,提问作者Chor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:05:34