React中Refs的作用是什么?如何使用,父组件是函数组件ref如何获取子组件内容

简介: React中Refs的作用是什么?如何使用,父组件是函数组件ref如何获取子组件内容

Refs概念

refs,我的理解就是react提供的一种方式或者工具。

refs的作用:

访问DOM节点

访问React元素

为什么要使用refs?

在某些情况下,你需要在典型数据流之外强制修改子组件。被修改的子组件可能是一个 React 组件的实例,也可能是一个 DOM 元素。对于这两种情况,可以使用react提供的refs来获取需要的目标元素或者实例。

通常不建议这样做,因为它会打破组件的封装

什么时候使用refs?

官方列举的使用场景:

管理焦点,文本选择或媒体播放。

触发强制动画。

集成第三方 DOM 库。

如何访问Refs?

由于refs在使用时,可以用于具体的某个元素,也可以用于组件上。所以,在访问时,这两种使用方式,获取到的对象是不一样的。

当 ref 被传递给 render 中的元素时,对该节点的引用可以在 ref 的 current 属性中被访问const node = this.myRef.current;

current属性根据节点的类型而有所不同:

当 ref 属性用于 HTML元素时,ref接收DOM 元素作为其 current 属性。

当 ref 属性用于自定义 class 组件时,ref 对象接收组件的挂载实例作为其 current 属性。

父组件如何获得子组件的Ref?

第一种:使用React.forwardRef

我们通过调用 React.createRef 创建了一个 React ref 并将其赋值给 ref 变量。
我们通过指定 ref 为 JSX 属性,将其向下传递给 <Children ref={ref}>。
React 传递 ref 给 forwardRef 内函数 (props, ref) => …,作为其第二个参数。
我们向下转发该 ref 参数到 <button ref={ref}>,将其指定为 JSX 属性。
当 ref 挂载完成,ref.current 将指向 DOM 节点。

第二种:在子组件初始化的时候将ref通过事件传递给父组件

创建ref的形式有三种:

传入字符串,使用时通过 this.refs.传入的字符串的格式获取对应的元素

传入对象,对象是通过 React.createRef() 方式创建出来,使用时获取到创建的对象中存在 current 属性就是对应的元素

传入函数,该函数会在 DOM 被挂载时进行回调,这个函数会传入一个 元素对象,可以自己保存,使用时,直接拿到之前保存的元素对象即可

传入hook,hook是通过 useRef() 方式创建,使用时通过生成hook对象的 current 属性就是对应的元素

三、应用场景

在某些情况下,我们会通过使用refs来更新组件,但这种方式并不推荐,更多情况我们是通过props与state的方式进行去重新渲染子元素

过多使用refs,会使组件的实例或者是DOM结构暴露,违反组件封装的原则

例如,避免在 Dialog 组件里暴露 open() 和 close() 方法,最好传递 isOpen 属性

但下面的场景使用refs非常有用:

对Dom元素的焦点控制、内容选择、控制

对Dom元素的内容设置及媒体播放

对Dom元素的操作和对组件实例的操作

集成第三方 DOM 库


相关文章
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
219 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
前端开发
|
前端开发
react学习(17)回调形式的ref
react学习(17)回调形式的ref
182 9
|
存储 前端开发 容器
react学习(18)createRef形式的ref
react学习(18)createRef形式的ref
127 5
|
前端开发 知识图谱
[译] React 中的 "最新 Ref 模式"
[译] React 中的 "最新 Ref 模式"
|
JavaScript
react18【系列实用教程】useRef —— 创建 ref 对象,获取 DOM (2024最新版)
react18【系列实用教程】useRef —— 创建 ref 对象,获取 DOM (2024最新版)
261 0
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
177 1
|
前端开发 JavaScript 开发者
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(二)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
195 0
|
JavaScript 前端开发 算法
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(一)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
297 0
|
前端开发 JavaScript
深入了解 React 中的 Ref:不是魔法,是超级工具
深入了解 React 中的 Ref:不是魔法,是超级工具
441 0