React 19中@eslint-react的两个不稳定值规则是否仍具相关性?
React 19中ESLint规则与useMemo的使用疑问解答
背景
我注意到ESLint React规则no-unstable-default-props和no-unstable-context-value默认处于禁用状态,它们的作用是通过useMemo()避免因引用不稳定导致的不必要重渲染,看似实用。2024年12月发布的React 19引入了React Compiler,可自动处理memoization。不过useMemo文档仅提及React Compiler「减少了手动调用useMemo的需求」,后续仍罗列了旧版React中useMemo的所有用例。网上搜索发现useMemo「很少」需要,但具体何时使用并不明确。因此想请教:这两个规则在React 19中是否仍具相关性?在触发规则的场景下,是否仍需要使用useMemo?
解答
一、两个ESLint规则在React 19中的相关性
- 这两个规则的核心目标是避免因默认props/context值的引用不稳定(每次渲染创建新对象/数组等)引发的不必要重渲染,这个问题在React 19中并未消失。
- React Compiler的自动memoization能覆盖绝大多数常规场景,但如果你的项目尚未启用Compiler(比如处于版本过渡阶段),或者存在Compiler无法优化的边界场景,这两个规则依然能帮你提前识别潜在性能问题,并非完全失去价值,只是优先级有所降低。
二、触发规则时是否仍需使用useMemo?
需分两种场景判断:
- 已启用React Compiler的项目
- 对于常规触发规则的场景(比如默认props是动态创建的对象、context值是每次渲染生成的数组),Compiler会自动识别并稳定这些值的引用,无需手动用
useMemo包裹。 - 但如果存在Compiler无法覆盖的特殊情况:比如默认props/context值依赖Compiler无法追踪的外部变量、或者值会被用于非React渲染逻辑(如作为第三方库的参数,且该库依赖引用稳定性),这时仍需要手动用
useMemo来稳定引用。
- 对于常规触发规则的场景(比如默认props是动态创建的对象、context值是每次渲染生成的数组),Compiler会自动识别并稳定这些值的引用,无需手动用
- 未启用React Compiler的项目
- 触发规则时,依然需要通过
useMemo(或把值提取到组件外部作为常量)来稳定引用,避免不必要重渲染,规则的指导意义和旧版React中一致。
- 触发规则时,依然需要通过
补充:当前useMemo的适用场景
除上述特殊情况外,useMemo依然在以下场景发挥作用:
- 缓存昂贵的计算结果,避免每次重复执行高开销运算;
- 当值需要传递给未被React Compiler优化的第三方组件,且该组件依赖引用稳定性来避免重渲染时;
- 当值被用于React之外的逻辑(如订阅、事件监听的依赖),需要稳定引用以避免重复触发副作用时。
内容的提问来源于stack exchange,提问作者hb20007
相关产品推荐
相关产品推荐

