当前位置:首页 > React

react中高阶组件如何获取dom

2026-01-26 01:25:59React

高阶组件获取 DOM 的方法

在 React 中,高阶组件(HOC)可以通过 ref 转发或直接使用 React.forwardRef 来获取被包裹组件的 DOM 节点。以下是具体实现方式:

方法一:使用 React.forwardRef 转发 ref

通过 React.forwardRef 将 ref 传递给被包裹的组件,从而直接访问其 DOM 节点。

import React, { forwardRef } from 'react';

const withHOC = (WrappedComponent) => {
  const EnhancedComponent = forwardRef((props, ref) => {
    return <WrappedComponent {...props} ref={ref} />;
  });
  return EnhancedComponent;
};

// 使用示例
const MyComponent = forwardRef((props, ref) => (
  <div ref={ref}>This is a wrapped component</div>
));

const EnhancedComponent = withHOC(MyComponent);

function App() {
  const domRef = React.useRef(null);

  React.useEffect(() => {
    console.log(domRef.current); // 输出 DOM 节点
  }, []);

  return <EnhancedComponent ref={domRef} />;
}

方法二:通过 props 传递 ref

如果无法直接使用 forwardRef,可以通过自定义 prop(如 innerRef)传递 ref。

const withHOC = (WrappedComponent) => {
  return function HOC(props) {
    return <WrappedComponent {...props} innerRef={props.innerRef} />;
  };
};

const MyComponent = ({ innerRef }) => (
  <div ref={innerRef}>This is a wrapped component</div>
);

const EnhancedComponent = withHOC(MyComponent);

function App() {
  const domRef = React.useRef(null);

  React.useEffect(() => {
    console.log(domRef.current); // 输出 DOM 节点
  }, []);

  return <EnhancedComponent innerRef={domRef} />;
}

方法三:手动绑定 ref

在类组件中,可以通过回调 ref 或 React.createRef 手动绑定 ref。

react中高阶组件如何获取dom

const withHOC = (WrappedComponent) => {
  return class HOC extends React.Component {
    constructor(props) {
      super(props);
      this.domRef = React.createRef();
    }

    componentDidMount() {
      console.log(this.domRef.current); // 输出 DOM 节点
    }

    render() {
      return <WrappedComponent ref={this.domRef} {...this.props} />;
    }
  };
};

class MyComponent extends React.Component {
  render() {
    return <div>This is a wrapped component</div>;
  }
}

const EnhancedComponent = withHOC(MyComponent);

注意事项

  • 使用 forwardRef 是官方推荐的方式,能避免 prop 命名冲突。
  • 如果高阶组件需要拦截或修改 ref,需谨慎处理以避免破坏原有功能。
  • 函数组件默认不支持 ref,必须通过 forwardRef 或转换为类组件实现。

标签: 高阶组件
分享给朋友:

相关文章

vue轮播组件实现

vue轮播组件实现

Vue 轮播组件实现方法 使用第三方库(如 Swiper) 安装 Swiper 库: npm install swiper 在 Vue 组件中引入 Swiper: <template…

vue radio组件实现

vue radio组件实现

Vue Radio 组件实现 在 Vue 中实现 Radio 组件可以通过原生 HTML 的 <input type="radio"> 结合 Vue 的响应式特性,或者使用第三方 UI 库…

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,主要包括单文件组件(SFC)、全局注册和局部注册。以下是常见的实现方法: 单文件组件(SFC) 单文件组件是 Vue 最推荐的组件化开发方式…

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现 Vue组件是Vue.js的核心概念之一,允许将UI拆分为独立可复用的代码片段。组件的实现方式有多种,以下是常见的几种方法。 单文件组件(SFC) 单文件组件以.vue为后缀,将…

vue table组件实现

vue table组件实现

Vue 表格组件实现方案 基础表格实现 使用<table>标签结合v-for指令渲染数据是最简单的实现方式: <template> <table> &…

vue 组件实现 遮罩

vue 组件实现 遮罩

Vue 组件实现遮罩层的方法 基础遮罩层实现 创建一个简单的遮罩层组件,使用绝对定位覆盖整个视口。以下是一个基础实现: <template> <div class="mask"…