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

使用useMemo导致React自定义Hook无限触发的原因是什么?

问题原因解析

1. useMemo 和 useEffect 的核心用途差异

useMemo 的设计目的是缓存昂贵的计算结果,避免组件每次渲染时重复执行耗时计算,它并不是用来处理副作用(比如异步请求、修改状态这类会影响组件外部或触发重渲染的操作)的工具。而 useEffect 才是 React 专门用来处理副作用的 Hook,它的执行时机和触发逻辑都是为副作用场景设计的。

2. 为什么用 useMemo 会导致无限触发?

你的代码里,useMemo 的回调函数调用了 getLPTokenData,这个函数内部通过 setStatus、setPayload 等方法修改了组件状态——状态更新会触发组件重新渲染。

而 React 并不保证空依赖的 useMemo 只会执行一次:当组件重新渲染时,React 可能会认为之前缓存的 useMemo 结果已经失效,会重新执行其回调函数,再次调用 getLPTokenData,再次触发状态更新,形成渲染→执行useMemo→修改状态→再次渲染的无限循环。

3. 为什么换成 useEffect 就正常?

useEffect 针对副作用做了专门的设计:当依赖项为空数组时,它只会在组件挂载完成后执行一次。即使回调里的 setState 触发了组件重新渲染,只要依赖项没有变化,useEffect 就不会再次执行,自然不会出现循环触发的问题。

正确写法示例

把 Hook 里的 useMemo 替换成 useEffect 即可:

useEffect(() => {
    getLPTokenData();
}, [])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:55:18