使用函数时组件的时候,ref转发是必须要了解的概念

// 实现 ref 的转发
const FancyInput = React.forwardRef((props, ref) => (<div><input ref={ref} type="text" /><div>我是自定义的函数式组件</div></div>
));
const App = () => {const ref = useRef();return (<div><FancyInput ref={ref} /><button onClick={() => {ref.current.focus()}}>调用input的focus方法</button></div>)
}ReactDOM.render(<App />, root);

如上,简介明了的解释了ref转发的概念。
但是,上面的 ref 透传的方式有什么问题呢

  • 站在 FancyInput 组件的角度,FancyInput组件在中间层,父组件App 越过了自己,直接获取了自己的子组件 inputref,子组件的DOM直接暴露给了父组件

  • input 组件的所有方法都直接暴露给App,App组件可以进行任意的操作,某些情况的不可控

  • 我们只是希望App可以操作的inputfocus方法,并不希望它随意操作其他方法

useImperativeHandle 就是来解决这个问题的:

const FancyInput = React.forwardRef((props, ref) => {const inputRef = useRef();useImperativeHandle(ref, () => ({focus: () => {// 这里可以加自己的逻辑哦inputRef.current.focus();}}));return (<div><input ref={inputRef} type="text" /><div>我是自定义的函数式组件</div></div>)
});
const App = props => {const fancyInputRef = useRef();return (<div><FancyInput ref={fancyInputRef} /><button onClick={() => {fancyInputRef.current.focus()}}>调用FancyInput组件的 focus方法</button></div>)
}ReactDOM.render(<App />, root);

使用 useImperativeHandle 后,FancyInput有自己的 ref,通过 React.forwardRef 将父组件的 ref 透传过来,通过 useImperativeHandle 方法来暴露指定的方法给父组件调用,完美的解决了上面的问题。你还可以自己在 input 的 focus 方法上加一些自己的逻辑或者副作用,是不是有点钩子的意味了。


注意: useImperativeHandle 和 React.forwardRef 必须是配合使用的。

React useImperativeHandle相关推荐

  1. [react] 请说说什么是useImperativeHandle?

    [react] 请说说什么是useImperativeHandle? // useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值. // useImperati ...

  2. fs react 使用 保存文件_入门TypeScript编写React

    使用 create-react-app 开启 TypeScript Create React App 是一个官方支持的创建 React 单页应用程序的CLI,它提供了一个零配置的现代构建设置.当你使用 ...

  3. React tsx 生成随机验证码

    React tsx 生成随机验证码 最近开发React 使用tsx编写,没有找到什么好的随机生成验证码的插件,自己就手撸了一个,废话不多话,直接上代码. tsx文件如下: React代码片. impo ...

  4. react通过hook实现父组件调用孙子组件方法(非redux)

    项目中遇到一个父组件需要触发孙子组件方法的需求.项目又没有安装redux,经查阅, useImperativeHandlehttps://react.docschina.org/docs/hooks- ...

  5. React 函数组件导出自定义方法的办法说明

    在进行React开发时,函数组件是比较方便的,由于函数组件没有this指针,因此如果想在父组件里调用函数型子组件的方法,就需要用到React.useImperativeHandle 这个帮助函数. 办 ...

  6. react学习笔记(完整版 7万字超详细)

    1. React基础 1-1. react-调试插件安装 浏览器右上角 - ===> 更多工具 ===> 扩展程序 ==> 开启开发者模式 ==> 将调试插件包拖拽进来即可 1 ...

  7. ANTD react 手机号(验证码)登陆 + 账号登陆(图形验证码)

                       这种页面可能是大家常用的,但重写比较费时间,之前没有搜到完整的,在这里自己总结一下,方面复用 代码: <LoginFormformRef={formRef} ...

  8. React-Hooks之useImperativeHandle使用,让父组件操纵子组件的状态和方法

    您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~ useImperativeHandle是react官方为了简便我们的ref操作,同时还可以让子组件返回给父组件自身的 ...

  9. React-Hooks

    什么是Hooks? Hooks是一类特殊的函数,适用于React的函数组件,可以让我们在不编写class的情况下使用state及其他的React特性,比如副作用处理及生命周期等. 为什么要Hooks? ...

最新文章

  1. 《1024伐木累》-人生最高境界,长的好看
  2. 跑yolo3模型出的效果图_效果图和效果图设计到底有什么区别?区别大着呢,亲……...
  3. OpenWrt DNS问题排查
  4. LeetCode-剑指 Offer 04. 二维数组中的查找
  5. 高德地图天气图标符号大全_共享雨伞,高德这波营销格外暖!
  6. 进程、线程和协程的理解
  7. idea修改html不能立刻生效,解决idea debug模式下修改代码却不能生效
  8. Ifvisible.js – 判断网页中的用户是闲置还是活动状态
  9. 揭秘鸿蒙生态背后的DevOps实践
  10. C++ 序列式容器之vector
  11. String,StringBuffer,StringBuilder效率优先关系说明
  12. 利用MapabcAPI实现基于浏览器的地理定位
  13. 利用Bootstrap制作一个流行的网页
  14. 免费的聚合数据新闻头条API接口调用
  15. 跳绳机 高频霍尔开关 MH253
  16. pytho编码,关键字,注释,字符串形式,替换等变化基础常识
  17. Hibernate: Duplicate entry for key错误排查
  18. 哪种性格的人,更适合转管理?
  19. 打破思维定势的几个方法
  20. 300英雄11月服务器维护,《300英雄》【公告】2019年11月14日06:00-09:00全区停机更新公告...

热门文章

  1. linux服务器之百度网盘下载器 bypy
  2. java获取系统环境变量
  3. MATLAB神经网络算法
  4. 【办公类-16-01-02】“2022学年上半学期-代班排班表(跳过节日)”(python 排班表系列)
  5. 诺亚传说虚拟机 游戏总是提示:网络暂时无法连接,重启还是无法登陆.
  6. Unity 3D插件大全
  7. 龙之谷穿越java游戏_打开次元梦境! 《龙之谷》平行世界大穿越
  8. 【C语言】关于我回头学的那些基础语法(一)
  9. 每周推荐短视频:招人难?狼叔靠持续写作来解决
  10. 我的世界java版遗迹与神器模组_我的世界遗迹与神器