glownight

返回

满分答案#

在 React 中获取真实 DOM 节点,首选使用 useRef() 钩子

  1. 创建 ref 对象 → const ref = useRef(null)
  2. 绑定到元素上 → <div ref={ref} />
  3. useEffect / 事件回调 中通过 ref.current 获取真实 DOM
  4. 函数组件获取子组件 DOM,需搭配 forwardRef

一、最标准、最常用方法:useRef#

1. 获取当前组件内的 DOM(最简单)#

import { useRef, useEffect } from 'react';

function App() {
  // 1. 创建 ref
  const domRef = useRef(null);

  // 2. DOM 渲染完成后才能拿到( useEffect )
  useEffect(() => {
    // 真实 DOM 节点
    console.log(domRef.current); 
    // 可以操作:聚焦、样式、获取宽高、滚动等
    domRef.current.focus();
  }, []);

  // 3. 绑定到元素
  return <input ref={domRef} />;
}
jsx

二、获取子组件的 DOM 节点#

子组件必须用 forwardRef 把 ref 转发出去

import { useRef, forwardRef } from 'react';

// 子组件
const Child = forwardRef((props, ref) => {
  return <div ref={ref}>子组件 DOM</div>;
});

// 父组件
function Parent() {
  const childDomRef = useRef(null);

  useEffect(() => {
    console.log(childDomRef.current); // 拿到子组件的 div DOM
  }, []);

  return <Child ref={childDomRef} />;
}
jsx

三、获取 DOM 的时机(非常重要)#

  1. 渲染完成后获取 → useEffect(最安全)
  2. 事件触发时获取 → 点击/输入等事件里
  3. useLayoutEffect → DOM 更新后、浏览器绘制前(获取布局)

千万不要在组件渲染期间直接拿,会是 null!


四、类组件写法(了解即可)#

class App extends React.Component {
  componentDidMount() {
    console.log(this.domRef);
  }
  render() {
    return <div ref={(el) => (this.domRef = el)} />;
  }
}
jsx

五、总结#

  1. 获取 DOM 统一用 useRef
  2. 绑定:ref={domRef}
  3. 获取:domRef.current
  4. 必须在 useEffect 或事件里拿

一句话记忆#

创建 ref → 绑定元素 → useEffect 里拿 current

React 中如何获取 DOM 节点?
作者 glownight
发布于 2026年1月25日