forwardRef 转发引用

最后更新:2026-10-28

forwardRef 转发引用

函数组件默认不接收 ref。forwardRef 把父组件传入的 ref 转发给内部某个 DOM 节点,让「自定义输入框、按钮」这类封装组件也能像原生元素一样被聚焦、测量。React 19 起可直接收 ref,旧版本必须用它。

分组副作用与性能
类型API
引入版本React 16.3

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

const FancyInput = forwardRef(function FancyInput(props, ref) {
  return <input ref={ref} {...props} />   // 挂到真实 DOM
})

// 使用:<FancyInput ref={inputRef} />

⚙️ 参数

render 函数(props, ref) => JSX。第二个参数 ref 即父组件传入的引用,须挂到真实 DOM 或再转发的组件上。

返回值:返回带 ref 转发能力的新组件:父组件的 ref.current 将指向 render 内部挂载的节点。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

点按钮后蓝框输入框获得焦点并清空内容——ref 穿过了 FancyInput 的封装,直达内部真实 input。

💡 要点

💡 提示 React 19 中函数组件可直接接收 ref prop,无需再包 forwardRef;旧版本必须用它。
ℹ️ 说明 ref 参数必须挂到真实 DOM 元素上,挂到普通组件不转发则收不到。
⚠️ 注意 不要滥用转发 ref 操纵子组件内部——优先暴露声明式 props;需要更多命令式接口时配合 useImperativeHandle。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q 为什么函数组件不能直接收 ref?
A 函数组件没有实例,ref 无处可挂;React 18 及以前把 ref 排除在 props 之外,需 forwardRef 显式转发。
Q React 19 有什么变化?
A ref 成为普通 prop,函数组件直接写 function Cmp({ ref }) 即可,forwardRef 不再必需(仍兼容)。
Q useImperativeHandle 和直接转发有什么区别?
A 直接转发暴露整个 DOM;useImperativeHandle 可自定义暴露的方法集合(如 focus/clear),隐藏内部实现。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏