当前位置:首页 > React

react中高阶组件如何获取dom

2026-01-26 01:25:59React

高阶组件获取 DOM 的方法

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

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

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

react中高阶组件如何获取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。

react中高阶组件如何获取dom

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。

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 组件的基本实现 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种方式: 单文件组件 (SFC) 使用 .vue 文件格式,…

vue实现组件

vue实现组件

Vue 组件实现基础 Vue 组件是可复用的 Vue 实例,用于封装 UI 和逻辑。通过 .vue 文件或直接注册组件实现。 单文件组件 (SFC) 示例 <template&g…

vue实现广告组件

vue实现广告组件

Vue 实现广告组件的核心方法 数据驱动的广告内容渲染 通过 props 接收广告数据(如图片URL、跳转链接等),使用 v-bind 动态绑定属性。典型结构包含 <a> 标签嵌套 <…

vue组件的实现

vue组件的实现

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

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过d…

vue怎么实现组件缓存

vue怎么实现组件缓存

vue实现组件缓存的方法 在Vue中实现组件缓存可以通过内置的<keep-alive>组件完成,该组件能够缓存不活动的组件实例,避免重复渲染。 使用<keep-alive>…