为何React组件每次渲染时useState变量都会被初始化?
问题根本原因
你遇到的核心问题是函数组件的执行机制:每次组件渲染时,整个TestComponent函数体都会从头到尾执行一遍。
在你的代码里,useState(testData())是直接调用了testData(),把它的返回值传给useState。虽然React的useState只会在组件首次挂载时使用这个初始值,后续渲染会忽略这个参数,但因为每次渲染都会执行函数体里的代码,所以testData()会被反复调用,导致控制台每次都输出日志。
简单说:你传的是testData()(函数执行后的结果),而不是让React在需要的时候才去调用testData。
解决方法
把useState的参数改成惰性初始化函数——也就是传递一个返回初始值的无参函数,React只会在组件首次挂载时执行这个函数来获取初始值,后续渲染不会再执行:
const [data, setData] = useState<number[]>(() => testData());
这样修改后,testData()只会在组件第一次渲染时被调用一次,后续counter变化导致的渲染不会再触发它。
关于useCallback的误区
你之前尝试用useCallback包裹testData是找错了方向:
- useCallback是用来在组件多次渲染中缓存函数引用的,而且必须在组件内部使用(不能在顶层),但你的问题根本不是函数引用的缓存问题,而是初始化时机的问题。
- 就算把testData用useCallback包起来,如果还是直接调用
testData()传给useState,照样会每次渲染都执行,因为调用操作本身在函数体里,每次渲染都会走一遍。
内容的提问来源于stack exchange,提问作者bassman21
相关产品推荐
相关产品推荐

