乐趣区

关于react.js:React报错之ref返回undefined或null

注释从这开始~

总览

当咱们试图在其对应的 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 元素还没有被渲染。

事件

你也能够在事件处理函数中拜访 refcurrent属性。

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 上。

退出移动版