React 的理念是数据驱动视图,但聚焦输入框、测量元素尺寸、播放视频这些事必须直接操作 DOM。useRef 返回一个贯穿渲染的可变容器:把 .current 指向真实节点即可命令式操作。它也常被用来保存不触发渲染的可变值,比如定时器 id。
函数组件默认拿不到 ref——它没有实例。forwardRef 让组件把父组件传入的 ref 转发给内部 DOM 或子组件;useImperativeHandle 则进一步定制暴露给父级的接口。useRef 的赋值不会触发重渲染,别用它存应当驱动视图的状态。
import { useRef, forwardRef, useImperativeHandle } from 'react'; const MyInput = forwardRef(function MyInput(props, ref) { const inputRef = useRef(null); useImperativeHandle(ref, () => ({ focus: () => inputRef.current.focus(), // 只暴露 focus 方法 })); return <input ref={inputRef} />; }); export default function App() { const ref = useRef(null); return ( <> <MyInput ref={ref} /> <button onClick={() => ref.current.focus()}>聚焦</button> </> ); }