useRef
、ref
和 forwardRef
都涉及到引用(refs)的使用,但它们的用途和行为有所不同。下面是它们的主要区别:
1. useRef
-
用途:在函数组件中创建和管理引用。
useRef
返回一个可变的ref
对象,该对象的.current
属性可以用来访问 DOM 节点或保存任意值。 -
使用方式:
import { useRef, useEffect } from "react"; function MyComponent() { const inputRef = useRef(null); useEffect(() => { inputRef.current.focus(); // 访问和操作 DOM 元素 }, []); return <input ref={inputRef} />; }
-
特点:
useRef
创建的引用对象在组件的整个生命周期内保持不变。- 可以用来保存任意数据,除了 DOM 节点。
2. ref
-
用途:在类组件中使用,或者通过
React.forwardRef
在函数组件中使用,来访问 DOM 节点或组件实例。 -
使用方式:
class MyClassComponent extends React.Component { constructor(props) { super(props); this.inputRef = React.createRef(); } componentDidMount() { this.inputRef.current.focus(); // 访问和操作 DOM 元素 } render() { return <input ref={this.inputRef} />; } }
function MyFunctionComponent(props, ref) { return <input ref={ref} />; } const ForwardedComponent = React.forwardRef(MyFunctionComponent);
-
特点:
ref
用于访问类组件的实例或函数组件的 DOM 元素。- 在函数组件中使用
ref
需要配合React.forwardRef
使用。
3. forwardRef
-
用途:允许函数组件接收
ref
并将其转发到子组件的 DOM 元素或其他组件。 -
使用方式:
import React, { forwardRef } from "react"; const MyComponent = forwardRef((props, ref) => ( <input ref={ref} {...props} /> )); function App() { const inputRef = useRef(null); useEffect(() => { inputRef.current.focus(); // 访问和操作 DOM 元素 }, []); return <MyComponent ref={inputRef} />; }
-
特点:
forwardRef
高阶组件允许函数组件接收ref
,并将ref
转发到子组件的 DOM 元素或其他组件上。- 适用于需要将
ref
传递给深层组件的情况。