当前位置:首页 > React

react ref如何使用

2026-02-12 04:51:06React

React Refs 的基本概念

Refs 提供了一种直接访问 DOM 节点或 React 组件实例的方式。通常用于需要直接操作 DOM 的场景(如焦点控制、动画触发)或与第三方库集成。

创建 Ref

使用 React.createRef()useRef Hook 创建 ref 对象:

  • 类组件

    class MyComponent extends React.Component {
      constructor(props) {
        super(props);
        this.myRef = React.createRef();
      }
      render() {
        return <div ref={this.myRef} />;
      }
    }
  • 函数组件

    import { useRef } from 'react';
    function MyComponent() {
      const myRef = useRef(null);
      return <div ref={myRef} />;
    }

访问 Ref 的值

通过 ref.current 获取 DOM 节点或组件实例:

react ref如何使用

function AutoFocusInput() {
  const inputRef = useRef(null);
  useEffect(() => {
    inputRef.current.focus(); // 自动聚焦到输入框
  }, []);
  return <input ref={inputRef} />;
}

回调 Refs

通过函数形式动态设置 ref,适用于 ref 对象需要动态变更的场景:

function CallbackRefExample() {
  const setRef = (node) => {
    if (node) {
      node.focus();
    }
  };
  return <input ref={setRef} />;
}

Ref 转发(Forwarding Refs)

通过 React.forwardRef 将 ref 传递给子组件,常用于高阶组件或封装库:

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="fancy">
    {props.children}
  </button>
));

function App() {
  const buttonRef = useRef(null);
  return <FancyButton ref={buttonRef}>Click Me</FancyButton>;
}

使用场景与注意事项

  • 典型场景

    react ref如何使用

    • 管理焦点、文本选择或媒体播放。
    • 触发强制动画。
    • 集成第三方 DOM 库(如 D3.js)。
  • 避免滥用

    • 优先使用 React 的状态和 props 控制组件行为。
    • 避免在渲染期间修改 ref.current,可能导致意外行为。
  • 函数组件限制

    • 函数组件没有实例,除非使用 forwardRefuseImperativeHandle 暴露特定方法。

示例:结合 useImperativeHandle

通过 useImperativeHandle 自定义暴露给父组件的 ref 值:

const InputWithFocus = React.forwardRef((props, ref) => {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => inputRef.current.focus(),
  }));
  return <input ref={inputRef} />;
});

function Parent() {
  const inputRef = useRef();
  return (
    <>
      <InputWithFocus ref={inputRef} />
      <button onClick={() => inputRef.current.focus()}>Focus</button>
    </>
  );
}

分享给朋友:

相关文章

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

react如何注销

react如何注销

React 组件的注销方法 在 React 中,组件的注销通常指的是在组件卸载时执行清理操作,例如取消订阅、清除定时器或释放资源。以下是几种常见的方法: 使用 useEffect 钩子的清理函数…

uniapp中如何使用iconfont

uniapp中如何使用iconfont

使用 Iconfont 在 Uniapp 中的步骤 下载 Iconfont 资源 访问 Iconfont 官网,选择需要的图标并添加到项目。下载时选择 Font class 格式,解压后会得到 .tt…

react native如何

react native如何

React Native 基础知识 React Native 是一个由 Facebook 开发的框架,用于使用 JavaScript 和 React 构建跨平台移动应用。它允许开发者编写一次代码,同时…

react如何同步修改

react如何同步修改

同步修改状态的常见方法 在React中同步修改状态通常涉及使用useState或useReducer钩子,结合React的批处理机制确保状态更新的一致性。以下是几种典型场景的解决方案: 直接使用us…

react如何检测窗口

react如何检测窗口

监听窗口大小变化 使用useEffect钩子和resize事件监听窗口尺寸变化。在组件挂载时添加事件监听器,卸载时移除监听器以避免内存泄漏。 import { useState, useEffect…