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

为什么React.memo的areEqual无需校验使用prevState的方法相等性?

原理说明
  1. 首先明确两个基础逻辑:
  • 每次CatsViewer组件重新渲染时,useFetchCats都会生成一个全新的fetchCats函数实例,正常情况下prevProps.fetchCats === nextProps.fetchCats永远为false。
  • 你自定义的React.memo比较回调仅判断cats是否深相等:
    • 若cats发生变化,isEqual返回false,MemoizedCats会正常重新渲染,拿到最新的fetchCats和cats属性,运行无问题。
    • 若cats没有变化,isEqual返回true,MemoizedCats会跳过渲染,继续使用旧props中的fetchCats实例。
  1. 旧fetchCats实例能正常运行的核心原因:
  • state更新采用了函数式写法:你使用的setCats((prevCats) => [...newCats, ...prevCats])不需要依赖当前闭包内的cats值,React会自动传入当前最新的state,哪怕是旧闭包生成的fetchCats调用,也能正确完成state更新,不会出现闭包陈旧值问题。
  • 游标存储用了useRef:useRef返回的是跨渲染周期的可变引用,所有渲染生成的fetchCats闭包访问的都是同一个ref对象,只要cursor.current被更新过,旧fetchCats拿到的也永远是最新的游标值,不会出现游标陈旧的问题。

如果修改setCats的写法为直接依赖闭包内的cats:setCats([...newCats, ...cats]),那么旧fetchCats调用时就会使用闭包捕获的旧cats值,导致state更新丢失数据,此时就会出现bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:04