首页 > 其他分享 >React useImperativeHandle Hook 90% 前端都不知道转发多个 Refs

React useImperativeHandle Hook 90% 前端都不知道转发多个 Refs

时间:2022-09-24 11:58:10浏览次数:81  
标签:useRef 常量 useImperativeHandle 代码 React Hook 组件 ref

我报名了Goldstone Project Phase 1 Challenge——瓜分100,000奖池,这是我的第13篇文章, 点击查看活动详情

为什么ref不属于props,而是需要forwardRef呢?

当我们有一个非常简单的表单组件时,伪代码如下:

 常量形式 = () => {  
 返回<表格>  
 <标签为=“名称”></ label >  
 < 输入类型 = “文本” id = “名称” ></ input >  
 <按钮> 提交</ button >  
 </ form >  
 }  
 复制代码

我想直接从外面获取按钮的DOM引用,怎么办?

理想情况下,我们传递一个 ref 属性。

 常量页 = () => {  
 常量 buttonRef = useRef()  
 返回 < 表单引用 = {buttonRef} />  
 }  
 复制代码

然后在Form组件中接收并绑定。

 常量形式 = ( { ref }) => {  
 返回<表格>  
 <标签为=“名称”></ label >  
 < 输入类型 = “文本” id = “名称” ></ input >  
 <button ref = {ref} > 提交</ button >  
 </ form >  
 }  
 复制代码

但不幸的是,React 并没有这样做。

相应地,React 发明了 forwardRef,这使得代码难以阅读。

 const Form = forwardRef( ( props, ref ) => {  
 返回<表格>  
 <标签为=“名称”></ label >  
 < 输入类型 = “文本” id = “名称” ></ input >  
 <button ref = {ref} > 提交</ button >  
 </ form >  
 })  
 复制代码

为什么要用这种方式?因为 ref 不仅仅是一个 DOM 节点引用,它的作用是“一个不会被重新渲染的状态”。

为什么 ref 不是 refs?

接下来,我的需求发生了变化,我需要获取输入的DOM引用,我该怎么做呢?

最简单的方法是将 ref 绑定到表单元素,然后使用表单元素的 DOM API 来获取子元素。

但这似乎很不React。

当然有一种方法可以传递 ref 一个对象。

像这样:

 常量页 = () => {  
 常量 buttonRef = useRef()  
 常量 inputRef = useRef()  
 return < Form ref = {{ buttonRef , inputRef }} />  
 }  
 复制代码

那么子组件的代码是这样写的:

 const Form = forwardRef( ( props, ref ) => {  
 返回<表格>  
 <标签为=“名称”></ label >  
 < 输入参考 = {ref.inputRef} 类型 = “文本” id = “名称” ></ input >  
 <button ref = {ref.buttonRef} > 提交</ button >  
 </ form >  
 })  
 复制代码

但这又不适用于 TypeScript。

为什么?因为 ref 的类型应该是回调或者具有当前属性的对象。

不过其实只要把ref改成refs就行了,没有那么麻烦。

React 开发团队对此没有任何解释,我认为这是一个设计错误。

什么是 useImperativeHandle Hooks?

我相信大多数 React 工程师都没有接触过这个 API。

它是干什么用的?在进行命令式编程时似乎使用字面意思。 React 官方的说法是当需要暴露给父组件的 DOM 实例时才需要用到,一般用 forwardRef。

如何使用这个 Hooks?很简单。

父组件没有改变,仍然传递一个 ref。

 常量页 = () => {  
 常量 ref = useRef()  
 返回 < 表单 ref = {ref} />  
 }  
 复制代码

子组件即将发生一些变化。

 常量形式 = ( { ref }) => {  
 常量 labelRef = useRef();  
 常量 inputRef = useRef();  
 常量 buttonRef = useRef();  
 useImperativeHandle(ref, () => ({  
 获取标签(){  
 返回标签参考。当前的;  
 },  
 获取输入(){  
 返回输入参考。当前的;  
 },  
 获取按钮(){  
 返回按钮参考。当前的;  
 },  
 }))  
 返回<表格>  
 < 标签参考 = {labelRef} for = "名称" ></ label >  
 < 输入参考 = {inputRef} 类型 = “文本” id = “名称” ></ input >  
 <button ref = {buttonRef} > 提交</ button >  
 </ form >  
 }  
 复制代码

在父组件中访问子组件的 DOM 实例时:

 参考。当前的。输入  
 参考。当前的。按钮  
 复制代码

总结

如您所见,React 在设计上并不理想。它也有很多难以理解的东西。

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议。转载请附上原文出处链接和本声明。

这篇文章的链接: https://homecpp.art/2923/10473/2041

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39048/39562411

标签:useRef,常量,useImperativeHandle,代码,React,Hook,组件,ref
From: https://www.cnblogs.com/amboke/p/16725285.html

相关文章

  • [电容教程] 将 react app 转为 Android/ios app
    [电容教程]将reactapp转为Android/iosapp什么是电容器?电容器是一个跨平台的应用程序运行时,可以轻松构建在iOS、Android和Web上原生运行的Web应用程序。我们......
  • 【vue3】reactive不能直接赋值的解决方法
    在vue3里,ref和reacitve都可以定义响应式数据,但是两者有所不同。在使用reactive定义复杂结构的响应式数据时,如果你要对其赋值,会丢失其响应性。然后赋值是我们经常进行的操作......
  • 我作为 React 开发人员用来创建数据表的库
    我作为React开发人员用来创建数据表的库在本文中,我将讨论自2018年以来我用来在React应用程序中创建数据表的顶级React库。如今手动创建数据表并不是一种明智的方......
  • 将带有 ExpressJS 后端的 React 应用程序从 Heroku 迁移到 Netlify
    将带有ExpressJS后端的React应用程序从Heroku迁移到NetlifyPhotoby克里斯布里格斯on不飞溅Heroku将开始对HerokuDynos收费,这是运行节点服务器所需的资......
  • React 受控组件和非受控组件
    受控组件在HTML中,表单元素的标签<input>、<textarea>、<select>等的值改变通常是根据用户输入进行更新。而在React中,这些输入表单元素的值,应该保存在state中,并且只能由se......
  • react-native 实现环形(圆形)进度条
    废话不多说,直接上硬货:效果图   安装 react-native-anchor-point用于处理旋转中心点位置yarnaddreact-native-anchor-pointgithub仓库地址: https://github......
  • rxjs 在 react 下的应用
    设置一个subject,然后在组件内定义一个subscription想要发送事件就用subject.next订阅就赋值subject.asObservable().subscribe()直接看代码constsubject=ne......
  • 快速上手React编程 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1R4B-izNpESydo-yFNmU8xw点击这里获取提取码 ......
  • 教你如何实现react Scheduler(二)
    在上一篇文章中“反应调度程序(1)”中,我们使用MessageChannel来实现一个简单的任务调度功能。但是这个功能目前还是比较简单的,现在我们来改进一下,给任务增加优先级和过期......
  • 使用 PNPM 将 React App 中的磁盘空间减少 60%
    使用PNPM将ReactApp中的磁盘空间减少60%在React应用程序中使用PNPM减少磁盘空间的教程。Photoby诺德伍德主题on不飞溅您是否正在处理具有共同依赖项的......