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 库


相关文章
|
4月前
|
缓存 前端开发 JavaScript
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
🌟蒋星熠Jaxonic,前端探索者。专注React Hooks深度实践,从原理到实战,分享状态管理、性能优化与自定义Hook精髓。助力开发者掌握函数组件的无限可能,共赴技术星辰大海!
React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
238 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
277 9
|
11月前
|
前端开发 开发者
除了函数组件和类组件,React 还有其他创建组件的方式吗?
除了函数组件和类组件,React 还有其他创建组件的方式吗?
211 57
|
前端开发
react学习(17)回调形式的ref
react学习(17)回调形式的ref
185 9
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
545 3
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
242 3
|
存储 前端开发 容器
react学习(18)createRef形式的ref
react学习(18)createRef形式的ref
133 5
|
前端开发
react学习(22)高阶函数和函数柯里化
react学习(22)高阶函数和函数柯里化
155 1
|
前端开发
如何编写React函数组件
【8月更文挑战第17天】如何编写React函数组件
147 2