React中使用ref获取DOM节点总是返回null怎么办?
我在React组件里用useRef想获取一个div的宽度,但点击按钮时总报错说current是null。代码写成这样:
function BoxComponent() {
const boxRef = useRef(null);
const handleClick = () => {
console.log(boxRef.current.offsetWidth); // 这里报错
};
return (
<div>
<div ref="boxRef">内容区域</div>
<button onClick={handleClick}>测量宽度</button>
</div>
);
}
我明明给div加了ref=”boxRef”,但点击按钮时控制台显示boxRef.current是null。尝试过把ref初始化成new useRef(),也检查过组件是否渲染,但问题依旧。是不是因为用了函数组件?或者ref的写法哪里错了?
useRef返回的是个对象,你要把整个boxRef传给ref属性,不是传名字。另外初始化用 useRef(null) 是对的,别搞 new useRef() 这种不存在的东西。
还有就是,刚挂载的时候DOM可能还没生成,你得确保节点已经渲染出来了再访问。
改法很简单:
关键点就两个:一是 ref={boxRef} 要用花括号传引用,二是读之前判空。React会自动把DOM节点缓存到current里,只要节点渲染了就能拿到。
你之前写成 ref="boxRef",那只是个字符串属性,跟useRef完全没关系,current当然一直是null。