forwardRef 和 useImperativeHandle 有什么用?
默认函数组件不能接收 ref(React 把 ref 当特殊属性)。
- forwardRef:让函数组件能接收父组件传来的 ref,转发到内部某个 DOM/组件
- useImperativeHandle:限制父组件通过 ref 能访问到的「实例 API」(只暴露想暴露的方法/属性)
const Input = forwardRef((props, ref) => {
const inner = useRef()
useImperativeHandle(ref, () => ({
focus: () => inner.current.focus(),
clear: () => (inner.current.value = '')
}))
return <input ref={inner} />
})父组件
<Input ref={r} />只能调用r.current.focus()/clear(),拿不到原始 DOM 的全部能力。React 19 引入ref作为普通 prop,forwardRef 将逐渐被取代。