共计 1266 个字符,预计需要花费 4 分钟才能阅读完成。
注释从这开始~
总览
当咱们试图在其对应的 DOM 元素被渲染之前拜访其 current
属性时,React 的 ref 通常会返回 undefined
或者 null
。为了解决该问题,能够在useEffect
钩子中拜访ref
,或者当事件触发时再拜访ref
。
import {useRef, useEffect} from 'react';
export default function App() {const ref = useRef();
console.log(ref.current); // 👈️ undefined here
useEffect(() => {
const el2 = ref.current;
console.log(el2); // 👈️ element here
}, []);
return (
<div>
<div ref={ref}>
<h2>Hello</h2>
</div>
</div>
);
}
useEffect
useRef()
钩子能够传递一个初始值作为参数。该钩子返回一个可变的 ref
对象,ref
对象上的 current
属性被初始化为传递的参数。
咱们没有为 useRef
传递初始值,因而其 current
属性设置为 undefined
。如果咱们将null
传递给钩子,如果立刻拜访其 current
属性,将会失去null
。
须要留神的是,咱们必须拜访
ref
对象上的current
属性,以此来拜访设置了ref
属性的div
元素。
当咱们为元素传递 ref
属性时,比如说,<div ref={myRef} />
,React 将 ref
对象的 .current
属性设置为相应的 DOM 节点。
咱们应用 useEffect
钩子,是因为咱们想要确保 ref
曾经设置在元素上,并且元素曾经渲染到 DOM 上。
如果咱们尝试在组件中间接拜访 ref
上的 current
属性,咱们会失去 undefined,是因为 ref
还没有被设置,而且 div
元素还没有被渲染。
事件
你也能够在事件处理函数中拜访 ref
的current
属性。
import {useRef, useEffect} from 'react';
export default function App() {const ref = useRef();
console.log(ref.current); // 👈️ undefined here
useEffect(() => {
const el2 = ref.current;
console.log(el2); // 👈️ element here
}, []);
const handleClick = () => {console.log(ref.current); // 👈️ element here
};
return (
<div>
<div ref={ref}>
<h2>Hello</h2>
</div>
<button onClick={handleClick}>Click</button>
</div>
);
}
当用户点击按钮的时候,ref
曾经被设置好了,相应的元素曾经被渲染到 DOM 中,所以咱们可能拜访它。
总结
能够在 useEffect
钩子中拜访ref
,或者当事件触发时再拜访ref
。也就是说,要确保元素曾经渲染到 DOM 上。
正文完