React forwardRef 和 ref 区别是什么?displayName 又有什么作用?
· 6 min read
React ref 和 forwardRef 不是一个层级的概念。
ref 是 React 故意不放入 props 的"逃生通道",forwardRef 是把这个通道从 class 实例延伸到函数组件的桥梁。
- ref 是 React 特殊处理的 prop:class 组件默认挂到实例,函数组件默认拿不到
- forwardRef 把 ref 这个逃生通道"打通"到函数组件内部的 DOM 或组件实例
- 经典组合:forwardRef + useImperativeHandle,自定义暴露给父组件的方法集合
- displayName 给 DevTools 留个可读名字,避免看到一堆 "ForwardRef" / "Anonymous"
- React 19 起 ref 已经是普通 prop,forwardRef 即将退役——但理解它仍是排查老代码的基础
ref 为什么是个特殊 prop
写 React 时,每个 props 都可以在组件里通过参数拿到,唯独 ref 拿不到。这是 React 故意设计的,不是 bug。
ref 在 React 里被定义为"逃生通道"——让你能绕过 props 这套声明式数据流,直接拿到组件实例或 DOM 节点。比如:
function Parent() {
const inputRef = useRef(null);
useEffect(() => {
inputRef.current?.focus(); // 直接命令式操作 DOM
}, []);
return <Child ref={inputRef} />; // ref 不在 props 里
}
class 组件里,ref 默认会挂到实例上,所以你能直接拿到 this.inputRef.current。但在函数组件里,函数没有 this,也没有实例——所以 ref 默认根本拿不到。
React 文档明确说:ref 不是 prop