当前位置:首页 > 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中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。 基于自定义指令的实现 创建指令监听触摸事件,…

vue实现广告组件

vue实现广告组件

vue实现广告组件的方法 使用动态组件实现 在Vue中可以通过动态组件的方式加载广告组件,根据不同的条件展示不同的广告内容。动态组件使用<component :is="currentCompon…

react如何删除组件

react如何删除组件

删除 React 组件的几种方法 条件渲染法 通过状态控制组件是否渲染。当状态为 false 时,组件会被移除: const [showComponent, setShowComponent] =…

vue组件实现vmodel

vue组件实现vmodel

Vue 组件实现 v-model 在 Vue 中,v-model 是双向数据绑定的语法糖,默认情况下绑定 value 属性并监听 input 事件。在自定义组件中实现 v-model 需要正确配置 p…

vue实现列表组件

vue实现列表组件

Vue 列表组件实现方法 基础列表渲染 使用 v-for 指令渲染数组数据,需配合 :key 提升性能: <template> <ul> <li v-for…

vue实现布局组件

vue实现布局组件

Vue 实现布局组件的方法 基础布局组件结构 使用 Vue 的单文件组件(SFC)创建一个基础布局组件。布局组件通常包含头部、侧边栏、主体内容和页脚。 <template> <…