React ref 是如何拿到函数组件的实例
使用 forwordRef
将 input
单独封装成一个组件 TextInput
。
const TextInput = React.forwardRef((props,ref) => { return <input ref={ref}></input> })
用 TextInputWithFocusButton
调用它
function TextInputWithFocusButton() { // 关键代码 const inputEl = useRef(null); const onButtonClick = () => { // 关键代码,`current` 指向已挂载到 DOM 上的文本输入元素 inputEl.current.focus(); }; return ( <> // 关键代码 <TextInput ref={inputEl}></TextInput> <button onClick={onButtonClick}>Focus the input</button> </> ); }
useImperativeHandle
有时候,我们可能不想将整个子组件暴露给父组件,而只是暴露出父组件需要的值或者方法,这样可以让代码更加明确。而 useImperativeHandle
Api 就是帮助我们做这件事的。
const TextInput = forwardRef((props,ref) => { const inputRef = useRef(); // 关键代码 useImperativeHandle(ref, () => ({ focus: () => { inputRef.current.focus(); } })); return <input ref={inputRef} /> }) function TextInputWithFocusButton() { // 关键代码 const inputEl = useRef(null); const onButtonClick = () => { // 关键代码,`current` 指向已挂载到 DOM 上的文本输入元素 inputEl.current.focus(); }; return ( <> // 关键代码 <TextInput ref={inputEl}></TextInput> <button onClick={onButtonClick}> Focus the input </button> </> ); }
也可以使用 current.focus()
来做 input
聚焦。
这里要注意的是,子组件 TextInput
中的 useRef
对象,只是用来获取 input
元素的,大家不要和父组件的 useRef
混淆了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论