当前位置:首页 > 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提供了<transition>和<transition-group>两个内置组件,用于处理进入…

vue实现拖拽实现组件嵌套

vue实现拖拽实现组件嵌套

实现拖拽组件嵌套的核心思路 Vue中实现拖拽组件嵌套需要结合拖拽库(如vuedraggable)和组件递归渲染。核心在于动态管理嵌套数据结构,并通过事件传递实现层级更新。 安装必要依赖 推荐使用vu…

react组件如何通讯

react组件如何通讯

React 组件通讯方式 React 组件间的通讯方式主要包括以下几种方法,适用于不同场景下的数据传递和状态管理需求。 父子组件通讯(Props 传递) 父组件通过 props 向子组件传递数据或回…

Vue组件实现方法

Vue组件实现方法

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

vue 实现弹窗组件

vue 实现弹窗组件

Vue 弹窗组件实现 基础弹窗组件结构 创建一个名为Modal.vue的文件,定义弹窗的基础结构和样式: <template> <div class="modal-mask"…

vue 动态组件实现

vue 动态组件实现

vue 动态组件实现 Vue 的动态组件功能允许根据条件或用户交互动态切换不同的组件,主要通过 <component> 标签和 is 属性实现。 基本用法 通过 is 属性绑定组件名或组…