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
相关产品推荐
相关产品推荐

