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

React的useRef钩子是否不支持传入函数作为初始化参数?

关于useRef初始化复杂对象的疑问

背景

我习惯给useState传入函数来避免创建不必要的对象:

useState(() => /* 创建复杂对象 */)

我原本以为useRef也能以同样方式工作,但以下代码返回的是函数本身,而非执行一次初始化后得到的对象:

useRef(() => /* 创建复杂对象 */).current

我知道可以通过下面的方式实现需求,但写法不够简洁:

const myRef = useRef();
useEffect(() => {
    myRef.current = /* 创建复杂对象 */;
}, []);

是我遗漏了useRef的某个用法,还是这确实是它的功能限制?

补充说明

为明确问题,先说明useState和useRef的常规用法:

useState(createSimpleInitialValue());
useRef(createSimpleInitialValue());

每次渲染时都会耗费资源创建初始值,而这个值在首次渲染后就会被丢弃。对于简单对象来说影响不大,但复杂对象可能会引发性能问题。useState有对应的优化方案:

useState(() => createComplexObj());

我们传入函数而非对象,React会在首次渲染时调用该函数,后续渲染则跳过调用,因此只需创建一次对象。我原本希望useRef也具备该特性,但传入函数时它只会存储函数本身。官方文档未提及useRef支持传入函数的用法,但我仍希望存在某种内置的实现方式。


内容的提问来源于stack exchange,提问作者phil-daniels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:21:49