React学习笔记(九)refs 获取DOM节点/自定义组件的实例

从ADS到HFSS:耦合线带通滤波器的设计与模型转换实战 本文详细介绍了耦合线带通滤波器的完整设计流程,重点阐述了从ADS电路级快速优化到HFSS三维电磁场精确验证的模型转换实战方法。通过对比ADS理想模型仿真与HFSS全波仿真结果,指导读者进行参数校准与迭代优化,并分享了关键的板材选择、加工误差及端口设置等避坑指南,确保设计性能与实物测试高度一致。 阅读详情

React和Vue一样,不建议操作DOM,但是如果我们在某个场景必须操作DOM,那么也可以使用refs来实现。

refs的基本使用


refs的创建

refs是通过React.createRef()来创建的,通过使用ref属性来对应某个元素。一般在constructor中赋值给某个实例属性来达到多次复用的作用

class App extends React.Component{
    render(){
        return <MyComponent />
    }
}

class MyComponent extends React.Component{
    constructor(props){
        super(props);
        // 创建ref
        this.myRef=React.createRef();
        // 绑定方法
        this.btnClick=this.btnClick.bind(this);
    }
    btnClick(){
        // 打印ref对应的元素
        // 元素被放在ref的current属性中
        console.log(this.myRef.current);
    }
    render(){
        return <button ref={this.myRef} onClick={this.btnClick}>123</button>
    }
}

上面的代码,点击按钮就会打印出对应的元素
在这里插入图片描述

访问refs

当refs被传递给render中的元素的时候,可以通过current属性来访问,如同上面的代码一样

	btnClick(){
        // 打印ref对应的元素
        // 元素被放在ref的current属性中
        console.log(this.myRef.current);
    }

ref的current属性根据其放在不同的标签上有所不同

  1. 当放在html元素上时,current属性指向html元素
  2. 当放在自定义标签时,current属性指向挂载的实例

上面的代码就是第一种情况,对于第二种情况,修改上面的代码

class App extends React.Component{
    render(){
        return <MyComponent />
    }
}

class MyComponent extends React.Component{
    constructor(props){
        super(props);
        // 创建ref
        this.myRef=React.createRef();
        // 绑定方法
        this.btnClick=this.btnClick.bind(this);
    }
    btnClick(){
        // 打印ref对应的元素
        // 元素被放在ref的current属性中
        console.log(this.myRef.current);
    }
    render(){
        return <div>
                <button onClick={this.btnClick}>123</button>
                {/* ref指向自定义组件 */}
                <ChildComponent ref={this.myRef} />
                </div>
    }
}

class ChildComponent extends React.Component{
    render(){
        return <div>111</div>
    }
}

点击后发现和刚才结果不同
在这里插入图片描述
打印出来的变成了自定义组件的实例
因为ref的current指向的是组件的实例,和函数组件没有实例,所以无法将ref用在函数组件上
将刚才的自定义组件ChildComponent改成下面这个函数组件

function ChildComponent(props){
    return <div>111</div>
}

控制台会出现报错如下
在这里插入图片描述
但是我们还是可以函数组件内部使用ref的

function ChildComponent(props){
    let textRef=React.createRef();
    function consoleRef(){
        console.log(textRef.current);
    }
    return <div>
        <p ref={textRef}>123</p>
        <button onClick={consoleRef}>btn</button>
    </div>
}

这里能用是理所当然的,这和是函数组件或者是class组件没有关系,ref是指向html元素的。

传递DOM refs


ref指向子组件

通过在子组件上面使用ref属性指向React.createRef()创建的refs来达到将DOM从子组件传递到父组件的目的

render(){
    return <div>
            <button onClick={this.btnClick}>123</button>
            {/* ref指向自定义组件 */}
            <ChildComponent ref={this.myRef} />
            </div>
}

然而,这种方法并非理想的解决方法,我们最终只能得到子组件的实例,而非DOM,更何况上面也说了,函数组件无法使用该方法。

refs转发

refs转发通过React.forwardRef来创建一个子组件,并获取父组件的ref,将内部的元素中的ref属性指向传递来的ref,达到将DOM传递到父组件的目的

function ChildComponent(props){
    let textRef=React.createRef();
    function consoleRef(){
        console.log(textRef.current);
    }
    return <div>
        {/* 获取子组件中的refs */}
        <RefBtn ref={textRef} />
        <button onClick={consoleRef}>clickbtn</button>
    </div>
}

const RefBtn = React.forwardRef((props,ref)=>{
    // ref属性指向父组件传下来的ref
    return <button ref={ref}>
            refBtn
        </button>
})

点击clickBtn,会打印出button的DOM
在这里插入图片描述
React.forwardRef生成的组件在react-devtools中被当成一个组件
在这里插入图片描述

refs回调


refs回调是另一种设置refs的方法,不同于直接设置值,refs回调是通过传递一个方法,在方法中完成对refs的赋值,与之前不同的是,refs回调可以直接将元素赋值给refs,这样就不用多用一步去调用current属性了

class MyComponent extends React.Component{
    constructor(props){
        super(props);
        // 创建ref
        this.myRef=null;
        this.setMyRef=element=>{
            this.myRef=element;
        }
        // 绑定方法
        this.btnClick=this.btnClick.bind(this);
    }
    btnClick(){
        // 打印ref对应的元素
        // 打印的不再是current属性
        if(this.myRef)console.log(this.myRef);
    }
    componentDidMount(){
        this.btnClick()
    }
    render(){
        return <div>
                    <button onClick={this.btnClick}>123</button>
                    <div ref={this.setMyRef}>div</div>
                </div>
    }
}
AI漫剧实战:MiniMaxH3本地部署+ComfyUI工作流,6G显存出长视频 随着AI视频生成技术的普及,创作者开始追求在有限硬件条件下的本地化部署。本地部署不仅降低使用成本,更能获得对生成流程的完全可控性,这为高频次的内容生产提供了基础。以开源工作流引擎ComfyUI为依托,通过量化模型与显存优化,即便是6G显存的中端显卡也能流畅运行MiniMaxH3视频生成模型,输出60秒级别的AI漫剧片段。本文从视频生成原理出发,讲解模型选择、节点搭建、参数调优与提示词结构化设计,并延伸到剧本拆分、角色一致性控制、后期合成及平台变现路径,为AI漫剧创作者提供一套低成本、可复制的工程化方案。无论 阅读详情

相关推荐

深入解析PCIe Retimer:工作原理与典型应用场景

本文深入解析了PCIe Retimer的工作原理与核心价值。作为高速信号的中继再生器,Retimer通过时钟数据恢复和信号再生技术,有效解决长距离或复杂通道中的信号衰减与完整性问题,从而极大地扩展了PCIe链路的有效传输距离。文章详细阐述了其内部架构、自动与手动两种工作模式,并重点介绍了在长距离板间互连、复杂背板设计等典型应用场景中的关键作用。

weixin_29195615的博客 510

Vue 3 setup 中通过 ref 获取子组件实例数据(TS版)

vue3 在setup当中父组件获取子组件的实例数据

任磊 1万+

Layout常见错误汇总-不定时更

1、在做LVS时,出现中断错误 解决方法: 重新建立新的schematic和layout文件,对应好其中的元器件,同时两个文件的名字也要对应好“schematic”和“layout”,其他名字的话软件找不到如何对应。

weixin_38753095的博客 4万+

Vue3---通过 ref 获取子组件实例(子组件中的DOM结构、数据、及方法),vue3中ref的妙用,vue中获取调用子组件方法,vue中使用子组件数据

Vue3---通过 ref 获取子组件实例(子组件中的DOM结构、数据、及方法),vue3中ref的妙用,vue中获取调用子组件方法,vue中使用子组件数据

imkaifan的博客 2万+

优化YOLOv8检测精度:Damo-YOLO的RepGFPN特征融合技术解析【YOLOv8】

YOLOv8在结构上依旧延续了自YOLOv4以来的CSPNet(Cross Stage Partial Network)和FPN(Feature Pyramid Network)的设计,结合了PANet(Path Aggregation Network)来增强特征的多尺度表达。然而,随着目标检测任务的复杂性增加,如何更有效地融合不同层级的特征成为提升检测性能的关键。Damo-YOLO中的RepGFPN引入了重参数化的思想,通过在训练和推理阶段对特征融合模块进行结构优化,显著提升了检测效果。

博客 1583

Google Earth Engine(GEE)——使用归一化燃烧指数 (NBR) 绘制地表烧伤严重程度图

归一化燃烧指数(Normalized Burn Ratio, NBR)是一种遥感指标,用于评估野火或烧伤地面后的植被恢复情况。NBR能增强较大范围的火灾区域,如大于200公顷。它是通过比较远红外波段 (SWIR) 和近红外波段 (NIR) 的反射率来计算的。SWIR波段测量烧伤地面的反射率,NIR波段测量没有受到烧伤影响的植被的反射率。NBR的计算公式为:NBR =(NIR-SWIR)/(NIR + SWIR)。其中,NIR为近红外波段,SWIR为短波红外波段。

此星光明博客 3465

vue3获取ref实例结合ts的InstanceType

有时候我们模板引用,但是在使用的时候,ts提示却不行,没有提示组件通过暴露的方法名称,虽然这不是很影响,但是可以解决还是可以解决下~const sayHello = () => (console.log('我会说hello'))sayHello})然后我们在父级使用,输入完成会发现没有sayHello这个函数提示,所以这个时候我们就需要使用工具类型来获取其实例类型

动感超人的博客 3133

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)

Mculover666的博客(嵌入式) 7243

React 之 ref 详解

React提供的这个ref属性,表示为对组件真正实例的引用,其实就是ReactDOM.render()返回的组件实例;需要区分一下,ReactDOM.render()渲染组件时返回的是组件实例;而渲染dom元素时,返回是具体的dom节点。

subsistent的博客 1554

在YOLO中扩充新类别并且不影响旧类的识别精度

让我们先从简单的部分开始:用我们的新类训练自定义 YOLOv8 模型。在本教程中,我们将向模型添加车牌类。我们将使用Roboflow 中的一个数据集。这个数据集有两个车牌类。在开始训练之前,我们还必须对库进行一些更改。为了节省时间,我还将本教程中我们将进行的更改转换为补丁该补丁包含多项更改,但大多数更改都用于指南的下一部分。if RANK!= -1:是的,我们将编写一个回调。我们希望将此自定义训练模型的头部与 COCO 预训练模型中的旧头部一起使用。

如果想成为中心,那么就到中心去吧。 1226

【新能源汽车DCDC变换器测试优化全攻略:解决电能质量/发热/过充等核心痛点】

高压直流转12V低压的DCDC变换器是新能源汽车电源系统的核心枢纽,承担着为整车低压附件、控制器及12V蓄电池供电/补电的关键作用。在新能源汽车乘用车、商用车等不同车型实际运营中,因PDU内DC/AC等模块干扰、DCDC自身设计缺陷、整车匹配性不佳及测试验证不充分,频发12V输出电能质量差导致后端元器件烧毁、变换器发热严重、蓄电池过充/欠充、智能补电功能失效等问题,还伴随低压侧电压瞬跌/浪涌、电磁干扰超标、振动后接触不良、高温下效率骤降等行业高频故障,直接影响整车可靠性和运营安全性。本文基于国标。

优快云-新能源汽车研发测试专业博主 1270

uniapp 子组件 props拿不到数据_Vue学习笔记之父子组件通信以及经典案例

父组件、子组件直接的访问方式:1、父组件访问子组件可以用$childern 或者$refs$childern 的用法:当父组件引用多个子组件的时候,就会生成多个对应的对象:$childern可以访问子组件中的方法、data等数据但$childern一般在开发中比较少用,用$refs比较常用,因为$refs是可以通过key来绝对定位到对应的子组件,这种方法在实际开发中比较常用。$refs是一个对象类...

weixin_39776344的博客 902

2025年再论 SAP ABAP 系统经典的三层架构的理解

【摘要】本文基于作者19年SAP开发经验,深入解析SAP经典三层架构在S/4HANA时代的演进与实践。数据库层从多数据库支持转向HANA专属,通过SQLScript实现计算下推;应用层以ABAP平台为核心,融合OData和RAP等现代开发范式;表现层从SAP GUI过渡到Fiori Launchpad为主导。文章通过真实案例(如月末关账优化、ATP检查改造)展示三层协作如何提升性能,并探讨了本地/云/混合部署策略。全文贯穿SAP官方技术文档参考,为开发者提供体系化架构认知和实践指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 757

React获取DOM和获取组件实例的方式

当 ref 属性用于 HTML 元素时,构造函数中使用 React.createRef() 创建的 ref 接收底层 DOM 元素作为其 current 属性;来绑定函数组件中的某个元素, forwardRef中接收两个参数, 参数一: props, 参数二: ref,后面我们也会学习 hooks 中如何使用ref;该函数会在DOM被挂载时进行回调,这个函数回调时会传入一个元素对象,我们可以自己保存;方式提前创建出来一个对象, 将创建出来的对象绑定到要获取的元素上;使用时,直接拿到之前保存的元素对象即可;

m0_71485750的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

React获取DOM元素全解析:掌握Refs与Hook核心用法

本文详细探讨在React中如何获取组件对应的DOM元素。通过介绍useRef、createRef、回调Refs以及forwardRef等核心用法, 结合Mermaid流程图与代码示例, 帮助开发者掌握各种场景下的DOM操作最佳实践。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 775

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

React中获取DOM节点的两种方法

React提供的获取DOM元素的方法有两种,一是react-dom中的findDOMNode(),二是refs。 1、findDOMNode findDOMNode通常用于React组件的引用,其语法如下: import ReactDOM from 'react-dom'; ReactDOM.findDOMNode(ReactComponent); 复制代码 当组件被渲染到DOM中后,findDO...

大熊的博客 9808

React中获取DOM节点的两种方法(了解就行)

React提供的获取DOM元素的方法有两种,一是react-dom中的findDOMNode(),二是refs。 1、findDOMNode findDOMNode通常用于React组件的引用,其语法如下: import ReactDOM from 'react-dom'; ReactDOM.findDOMNode(ReactComponent); 当组件被渲染到DOM中后,findDOMNode会返回该组件实例对应的DOM节点。 示例: componentDidMount()..

hsany330的专栏 8155

React 如何获取组件对应的 DOM 元素

在 React 中,获取组件对应的 DOM 元素是一个非常重要的技能,尤其是在需要直接操作 DOM 时。使用 refs 是访问 DOM 的标准方式,无论是在类组件中还是函数组件中,refs 都能够让开发者轻松地获取和操作 DOM 元素。如何在类组件中使用createRef获取 DOM 元素。如何在函数组件中使用useRef获取 DOM 元素。如何使用回调 refs 获取 DOM 元素。如何处理多个 DOM 元素的 refs。在何时直接操作 DOM 元素,以及如何避免不必要的重渲染。

My_wife_QBL的博客 2307

React - 通过refs/React.createRef()获取DOM元素

1.通过回调Refs获取dom 需要在想被获取的元素上设置属性ref ref 可以是回调函数 import React from 'react'; export default class RefApp extends React.Component{ constructor(props){ super(props); this.copy= this...

dogeliu的博客 6744

使用refs获取节点_你想知道的关于 Refs 的知识都在这了

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取Refs 使用场景在某些情况下,...

weixin_31129503的博客 987

React组件中的refs

Refs to components  原文地址:http://facebook.github.io/react/docs/more-about-refs.html 这次学习用到了refs,遇到了点问题,所以去看了一下官方文档,本文是跟据官方文档中介绍的refs总结其中的用法。 其实一句React的实现原理,组件的状态变化都是依据数据流的流动而改变的,从原则上讲获取组件实例的状况是不

win0032的博客 3704

react中Refs的作用/创建/使用/访问

Refs refs,我的理解就是react提供的一种方式或者工具。 refs的作用: 访问DOM节点 访问React元素 为什么要使用refs? 在某些情况下,你需要在典型数据流之外强制修改子组件。被修改的子组件可能是一个 React 组件的实例,也可能是一个 DOM 元素。对于这两种情况,可以使用react提供的refs来获取需要的目标元素或者实例。 什么时候使用refs? 记录一个项目中用到的场景:使用refs获取react的ScrollView的组件实例,从而使用组件的scrollTo方法。 代码

祥哥的说 1738

在 React 组件中使用 Refs 指南

(给前端大全加星标,提升前端技能)英文:Yomi Eluwande 译文:joking_zhanghttps://segmentfault.com/a/11900000...

前端大全 644

React中最全获取表单数据:原生DOM、refs、 event.target.value、ant-design的Form组件

一、 可以使用原生方式DOM表单 handleSubmit = () => { var username = document.getElementById('getName').value; } render() { return ( <div> <input type="text" id="getName" place...

June.1 1万+

为什么需要react-merge-refs?解决React组件开发中的refs冲突难题

在React组件开发中,refs是连接DOM元素与组件逻辑的重要桥梁,但当多个功能需要访问同一个DOM元素时,refs冲突问题常常让开发者头疼不已。react-merge-refs作为一款轻量级的React工具库,提供了简单高效的解决方案,帮助开发者轻松合并多个refs,消除冲突隐患,提升组件健壮性。 ## 🤔 什么是refs冲突?为什么会发生? React中的refs允许开发者直接访问DO

gitblog_00431的博客 1133

web前端高级React - React从入门到进阶之Refs&DOM以及Refs转发

第二部分:React进阶 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到进阶之JSX虚拟DOM渲染为真实DOM的原理和步骤 第五章:React从入门到进阶之组件化开发及Props属性传值 第六章:React从入门到进阶之state及组件的生命周期 第七章:React从入门到进阶之React事件处理 第八章:React从入门到进阶之React条件渲染 第九章:React从入门到进阶之

lixiaosenlin的专栏 5673

React之Refs的使用

React之Refs的使用 我们在日常写React代码的时候,一般情况是用不到Refs这个东西,因为我们并不直接操作底层DOM元素,而是在render函数里去编写我们的页面结构,由React来组织DOM元素的更新。 凡事总有例外,总会有一些很奇葩的时候我们需要直接去操作页面的真实DOM,这就要求我们有直接访问真实DOM的能力,而Refs就是为我们提供了这样的能力。 看这个名字也知道,`Refs其实...

编程之路 3564
上一篇: React学习笔记(八)context
下一篇: React学习笔记 在todolist中加入redux
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值