前言

这系列是 React 基础教程(参考 React 官网),记录了自己入门学习 React 的笔记。不太适合有 React 丰富经验的同学,但希望看到此文的你,多少都有些收获。

文章代码均可在我的码云中找到:https://gitee.com/eminoda/react-learn/branches

为了更好的阅读体验,可在底下的“了解更多”查看原文(我的语雀知识库)。

Refs 概要

随着项目发展,肯定会有 React 要和第三方库(类似 jQuery),或者操作 DOM 的需求。

同时,对于自上而下的 React 数据流中,光靠 props 属性来控制子组件通常是不够的。一些特定场景,我们需要一种额外手段来修改子组件的"状态"。

综上,需要一个"靠谱"的方式来做这个事情,React 提供了 Refs 这个桥梁 。使我们能够直接访问原生的 DOM 节点,或者更好的和 React 元素(组件)进行交互。

官方示意,Refs 可以获取 class 的组件,以及 HTML 元素 DOM 的引用。函数组件由于没有 React 实例,所以不能像用于 class 组件那样来获取。

获取 Dom 引用

需求:点击 button 来触发 input 元素的聚焦操作。

代码示例:

说明:

1. 通过 React.createRef() 来创建 React 封装的 ref 引用对象 inputRefs

2. 将引用对象通过 JSX 语法赋值给 ref 属性,这样就和 Html 标签"扯上关系"了(引用对象即为 Dom 节点)

3. 通过绑定的事件操作,触发对 Dom 节点的控制(此处是聚焦操作 focus)

这样,在点击 button 后,对应的 input 就获取到了焦点了。

获取 class 引用

再次强调,Refs 不适用于获取函数组件的引用。

上面的 BaseInput 已经具备了控制焦点的操作,但可能会有其他需求来控制焦点。

比如下面示例了:父组件加载后,让 input 聚焦的需求。

代码示例:

说明:

1. 在构造器,初始化并创建 React 引用对象

2. 将该引用对象通过 JSX 模板,告知 BaseInput 的 ref 属性

3. 渲染后,就能拿到子组件实例的引用(current 属性),即能调用到子组件中 focusTextInput 方法

4. 当父组件挂载后,会触发生命周期 componentDidMount,从而用子组件引用来控制焦点事件

Refs 回调

看下例,比较和上面的用例的不同:

Refs 的回调方式:

1. 去除了 React.createRef() 方法,将引用对象以回调函数的形式来初始化

2. 同时,定义了 element (inputElement )。

3. 当渲染 render 执行后,会对该回调函数进行执行,从而 inputElement 得到赋值。

注意,该引用回调函数的触发时间点:

对于 class 组件使用:

注意:父组件中的 inputElement 将会是子组件中的元素 element,我们可以拿它来做我们需要的事情。

然后子组件通过 props.inputRefs 来接受此回调方法:

Refs 转发

如上述 Refs 的使用中,我们已经知道它不支持对函数组件的使用,另外父组件能操控到子组件上的属性方法(因为整个实例引用都拿到了)

所以为了更好的控制(例如,函数组件),可以使用 ref 转发。

同样,参照官网写了个示例:

代码上和之前例子做个对比,可以发现:

1. 子组件没有 React.createRef() 方法了

2. 而且子组件可以不通过 class 组件方式,通过 React.forwardRef 更自由的生成 React 元素

另外,引用对象的 current 的结果也不一样了:

class 组件获取子组件的 Refs:

而由 Refs 转发得到的引用:

前者是子组件实例的引用,后者是对应 Dom 的引用。

总结

Refs 的基本作用就是获取 DOM 节点和组件的引用,让我们能更有好的操控“React 元素”。

总比直接拿 document.getElementById 之类的要方便的多,多用于 Form 表单数据操作。

react 点击使父元素消失_React 基础:Refs 和 DOM 引用之间的关系相关推荐

  1. CSS line-hight ,vertical-align,父元素高度以及行框,行内框的关系

    参考文章:我对CSS vertical-align的一些理解与认识(一) css行高line-height的一些深入理解及应用 大小不固定的图片.多行文字的水平垂直居中 [line-height] l ...

  2. Vue 点击获得父元素,子元素,兄弟元素(DOM操作)

    <ul @click ="clickfun($event)"><li></li> </ul>methods: {clickfun(e ...

  3. 怎么样使父元素的overflow:hidden不影响到子级absolute绝对定位元素

    在项目中使用了popover组件,由于父级设置了overflow:hidden,当子级长度超出时,即使子元素是绝对定位元素也受到了影响. 查了很多资料,发现只要父级元素不设置position:rela ...

  4. 父镜像、子镜像、AUFS、UFS之间的关系、基础镜像

    一.Docker 到底为什么这么快? 两句话回答这个问题: 轻量级虚拟化,性能损耗小 AUFS文件系统分层设计,将资源利用率玩到极致 原理冗长,但很有意思,感兴趣请继续. 1.轻量级虚拟化技术 一句话 ...

  5. 关于浮动元素float使其父元素高度塌陷的原因及解决方法

    浮动元素使其父级元素高度塌陷 在没有设置浮动前(父级元素背景色为黑色) 给两个子元素设置左浮动后,在示例中仿佛父元素消失了,其实父元素并没有消失,只是高度被计算为0.这就要回到浮动元素的特性来说明此问 ...

  6. 垂直居中-父元素高度确定的多行文本(方法二)

    除了上一节讲到的插入table标签,可以使父元素高度确定的多行文本垂直居中之外,本节介绍另外一种实现这种效果的方法.但这种方法兼容性比较差,只是提供大家学习参考. 在 chrome.firefox 及 ...

  7. 65、如何解决浮动引起的父元素高度塌陷

    1. 父元素高度塌陷的原因 父容器的高度是内部容器撑开的,当子元素元素浮动后,脱离了正常文档流,导致父容器的高度塌陷,高度变为0px. 2.如何清除浮动 1. overflow: hidden; 原理 ...

  8. css笔记(选择器+清除浮动+定位+margin叠加以及子元素margin对父元素拖拽+羽化阴影)

    ##css(Cascading Style Sheet) 1.样式引入 行内样式:优点--效率高: 缺点--html与css代码耦合,复用性低内部样式表:优点--解决css和html代码耦合: 缺点- ...

  9. jquery遍历(父元素、祖先、后代)

    parent:被选元素的直接父元素(只会对上一级DOM元素遍历) $(document).ready(function(){$("span").parent().css({&quo ...

最新文章

  1. Android学习笔记(七):多个Activity和Intent
  2. 论文笔记——N2N Learning: Network to Network Compression via Policy Gradient Reinforcement Learning...
  3. map的内存释放问题
  4. Vue+Video.js播放m3u8视频流(海康威视摄像头+RTMP服务+FFmpeg)
  5. 【转】一篇文章读懂人力资源三支柱体系(COE・BP・SSC)
  6. python whl安装 缺少dll 查看具_解决Python安装时报缺少DLL问题【两种解决方法】
  7. 【BZOJ2758】Blinker的噩梦,扫描线+splay+链剖
  8. python怎么读取txt文件-Python笔记(读取txt文件中的数据)
  9. [Hyper-V]使用操作系统模板创建新的虚拟机
  10. 开发者的实用 Vim 插件(二)
  11. ASP.NET4.0尚未在Web服务器上注册
  12. 开源免费截图软件ShareX如何改变文字水印和logo特效透明度
  13. iOS Safari调试webview时 页面空白或者闪退解决
  14. win7系统设置无线临时(计算机到计算机)网络 手机,win7系统添加设置无线临时网络的操作方法...
  15. Shell进阶(三) 交互式脚本 函数 数组 分片 字符串处理
  16. C++ API 设计 06 第一章 简介
  17. 速算24点(C++)
  18. 字符输入函数详解(getchar的使用)
  19. 解读教育大数据的文化意蕴
  20. Java 实现高并发秒杀

热门文章

  1. tomcat服务器的虚拟目录,Windows系统下安装Tomcat服务器和配置虚拟目录的方法
  2. matlab用dft对连续信号做谱分析,用 DFT 对连续信号进行谱分析的误差问题有哪些?...
  3. 2018 蓝桥杯省赛 B 组模拟赛(五)题 B题
  4. 剑指offer面试题32 - I. 从上到下打印二叉树(二叉树)(BFS)
  5. TensorFlow精进之路(六):CIFAR-10图像是被(下)
  6. nohup执行的jar 怎么kill_使用Shell脚本如何启动/停止Java的jar程序
  7. gluster分布式存储 入门篇
  8. C语言指针的使用例子(1)指针地址的输出
  9. python3+ selenium3开发环境搭建-手把手教你安装python(详细)
  10. iOS开发 -------- Block技术中的weak - strong