六、【React基础】组件实例三大核心属性之三 refs + 事件处理

news2025/7/31 2:06:53

文章目录

  • 1、字符串形式的ref(过时/不推荐)
  • 2、回调形式的ref(推荐!!!)
    • ● 回调ref中回调次数的问题
  • 3、createRef创建ref容器(最新最推荐)
  • 4、事件处理

理解:

  • 组件内的标签可以定义ref属性来标识自己

编码:

  1. 字符串形式的ref:<input ref="input1"/>
  2. 回调形式的ref:<input ref={(c)=>{this.input1 = c}}/>
  3. createRef创建ref容器:myRef= React.createRef(); <input ref={this.myRef}/>

1、字符串形式的ref(过时/不推荐)

<input ref="input1"/>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>字符串形式的ref</title>
</head>

<body>
    <!-- 准备好一个“容器” -->
    <div id="test"></div>

    <!-- 引入react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- 引入react-dom,用于支持react操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- 引入babel,用于将jsx转为js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">
        //创建组件
        class Demo extends React.Component {
            //展示左侧输入框的数据
            showData = () => {
                const { input1 } = this.refs
                alert(input1.value)
            }
            //展示右侧输入框的数据
            showData2 = () => {
                const { input2 } = this.refs
                alert(input2.value)
            }
            render() {
                return (
                    <div>
                    	<!-- 字符串形式的ref -->
                        <input ref="input1" type="text" placeholder="点击按钮提示数据" />&nbsp;
                        <button onClick={this.showData}>点我提示左侧的数据</button>&nbsp;
                        <input ref="input2" onBlur={this.showData2} type="text" placeholder="失去焦点提示数据" />
                    </div>
                )
            }
        }
        //渲染组件到页面
        ReactDOM.render(<Demo/>, document.getElementById('test'))
    </script>
</body>

</html>

2、回调形式的ref(推荐!!!)

<input ref={(c)=>{this.input1 = c}}/>

//创建组件
class Demo extends React.Component {
    render() {
        return (
            <div>
                <input 
                    ref={c => this.input1 = c} 
                    type="text" 
                    placeholder="点击按钮提示数据"
                />&nbsp;
                <button onClick={()=>alert(this.input1.value)}>点我提示左侧的数据</button>&nbsp;
                <input 
                    ref={c => this.input2 = c} 
                    onBlur={()=>alert(this.input2.value)} 
                    type="text" 
                    placeholder="失去焦点提示数据" 
                />&nbsp;
            </div>
        )
    }
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2" />, document.getElementById('test'))

● 回调ref中回调次数的问题

如果 ref 回调函数是以内联函数( ref={c => this.input1 = c} )的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。

CODE:

class Demo extends React.Component{

    state = {isHot:false}

    showInfo = ()=>{
        const {input1} = this
        alert(input1.value)
    }

    changeWeather = ()=>{
        //获取原来的状态
        const {isHot} = this.state
        //更新状态
        this.setState({isHot:!isHot})
    }

    saveInput = (c)=>{
        this.input1 = c;
        console.log('@',c);
    }

    render(){
        const {isHot} = this.state
        return(
            <div>
                <h2>今天天气很{isHot ? '炎热':'凉爽'}</h2>
                <input ref={(c)=>{this.input1 = c;console.log('@',c);}} type="text"/><br/><br/>
                {/* class 的绑定函数的方式避免二次回调 */}
                {/*<input ref={this.saveInput} type="text"/><br/><br/>*/}
                <button onClick={this.showInfo}>点我提示输入的数据</button>
                <button onClick={this.changeWeather}>点我切换天气</button>
            </div>
        )
    }
}
//渲染组件到页面
ReactDOM.render(<Demo/>,document.getElementById('test'))

Result:
在这里插入图片描述

3、createRef创建ref容器(最新最推荐)

React.createRef 调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的

myRef= React.createRef();

<input ref={this.myRef}/>

class Demo extends React.Component {
    /* React.createRef 调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的 */
    myRef = React.createRef()
    myRef2 = React.createRef()
    
    render() {
        return (
            <div>
            	<input ref={this.myRef} type="text" placeholder="点击按钮提示数据" />&nbsp;
                <button 
                	onClick={()=>alert(this.myRef.current.value);}>
                    点我提示左侧的数据
                </button>&nbsp;
            	<input 
                    onBlur={()=>alert(this.myRef2.current.value)} 
                    ref={this.myRef2} 
                    type="text" 
                    placeholder="失去焦点提示数据" />&nbsp;
            </div>
        )
    }
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2" />, document.getElementById('test'))

4、事件处理

  1. 通过onXxx属性指定事件处理函数(注意大小写)

    1. React使用的是自定义(合成)事件, 而不是使用的原生DOM事件 —————— 为了更好的兼容性

    2. React中的事件是通过事件委托方式处理的(委托给组件最外层的元素) ————————为了的高效

  2. 通过event.target得到发生事件的DOM元素对象 ——————————不要过度使用ref



小白学习参考视频:尚硅谷React教程

中文官网:Refs and the DOM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3D应用开发在线IDE【中文版】

nunuStudio 是一个Web 3D应用程序的集成开发环境&#xff0c;它提供用于在 3D 世界中创建和编辑对象的工具&#xff0c;支持JavaScript和Python对3D场景进行二次开发。nunuStudio中文版 由 BimAnt 提供。 如果你曾经使用过其他类似的框架&#xff08;unity、playcanvas、godot …

Spring Boot 3.0 正式发布了!一个超重要的版本!!

首发于 JavaGuide (「Java学习面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试&#xff0c;首选 JavaGuide&#xff01;) 紧跟着 Spring Framework 6.0 的正式发布&#xff0c;就在昨天&#xff0c;Spring Boot 3.0 也正式发布了&#xff01; 这是一…

供应多臂PEG衍生物4-Arm PEG-Azide,4-Arm PEG-N3,四臂-聚乙二醇-叠氮

1、名称 英文&#xff1a;4-Arm PEG-Azide&#xff0c;4-Arm PEG-N3 中文&#xff1a;四臂-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Multi-arm PEGs 4、分子量&#xff1a;可定制&#xff0c;四臂-PEG 2000-叠氮、4-Arm PEG-N3 20000、…

深入分析序列化和反序列化原理,终于知道serialVersionUID到底有什么用了

一个问题引发的思考 下面是一个简单的socket通信demo。 通信数据类&#xff1a; package com.zwx.serialize.demo; public class SocketUser { public SocketUser(String id, String name) {this.id id;this.name name; }private String id; private String name;public St…

ADAU1860调试心得(2)硬件和软件的详细说明

硬件 一台64位的PC&#xff0c;一块ADAU1860EVB开发板&#xff0c;一个LARK-1860专用仿真器&#xff0c;音频线若干&#xff0c;mini USB线一根&#xff0c;一个到三个输入音源&#xff0c;可以是PC或者手机或者其他模拟音频输入设备&#xff0c; 一个输出音源设备&#xff0c;…

什么是DCS系统?DCS和SCADA的区别

如果你在工业自动化的企业环境中操作&#xff0c;可能听说过分布式控制系统 (DCS) 和监控和数据采集 (SCADA) 系统。 DCS系统和SCADA系统有很多共同点&#xff0c;因为它们都被称为受控计算机系统&#xff0c;接收和评估合法数据以实现远程访问监控和管理。 DCS(分布式控制系…

Python实现BP神经网络ANN单隐层分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念&#xff0c;是一…

内外通、效益增 | 数商云•瓴犀产品3.0开启全方位精准精细化协同模式

今年以来&#xff0c;芯片短缺、原材料价格飙升、集装箱价格高企等现象再次将国内外供应链问题推到了聚光灯下。在这种背景下&#xff0c;供应链协同的重要性日益凸显&#xff0c;供应链协同的趋势正在加速。一方面&#xff0c;随着电子商务、直播等前端消费场景的多样化&#…

The Sandbox 与韩流 Web 3.0 初创企业 Modhaus 达成合作

此合作关系旨在与韩流女团「tripleS」一起开展元宇宙业务。 简要概括 创建一个粉丝参与的社交中心并举办各种活动。 发布 tripleS NFT、人物化身的可穿戴设备和数位收藏品。 Modhaus 和 The Sandbox 将创建一个社交中心&#xff0c;让粉丝参与在元宇宙举办的活动&#xff0c;以…

基于MxNet实现目标检测-FasterRCNN【附部分源码及模型】

文章目录前言目标检测发展史及意义一、数据集的准备1.标注工具的安装2.数据集的准备3.标注数据4.解释xml文件的内容二、网络结构的介绍三、代码实现0.工程目录结构如下1.导入库2.配置GPU/CPU环境3.数据加载器4.模型构建5.模型训练1.学习率设置2.优化器设置3.损失设置4.循环训练…

流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

作者&#xff1a;李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件&#xff0c;适用于服务编排、工作流、审批流等场景&#xff0c;该组件已开源(https://github.com/JDEasyFlow/jd-easyflow)&#xff0c;目前在部门的内部业务系统和科技输出系统中广泛应用&…

项目经理年终夜话:我的“第二年状态”

近日&#xff0c;网络热词“第二年状态”又引发了网友们的热议&#xff0c;是指最初的热情消磨后&#xff0c;幻想破灭&#xff0c;在理想与现实巨大落差面前&#xff0c;陷入迷茫与彷徨。 而“如何度过第二年状态&#xff1f;”这一话题也被大家讨论和分享。其中&#xff0c;贾…

分布式文件系统HDFS实践及原理详解part3

HDFS原理 说明&#xff1a;3.5开头目录是因为和上篇文章内容同属一章&#xff0c;所以开头使用了3.5 3.5 HDFS核心设计 3.5.1 心跳机制 1、 Hadoop 是 Master/Slave 结构&#xff0c;Master 中有 NameNode 和 ResourceManager&#xff0c;Slave 中有 Datanode 和 NodeManag…

Milvus 2.2 版本发布!

经过了 4 个月的打磨&#xff0c;Milvus 2.2.0 于 11 月 18 日正式发版&#xff01;2.2 版本推出了包括基于磁盘的近似最近邻&#xff08;ANN&#xff09;索引算法、从文件批量导入数据、基于角色的访问控制等新特性。进一步提升了向量搜索的稳定性、搜索速度和灵活的扩缩容能力…

新建 ASP.NET MVC 三层项目 | 新建 ASP.NET MVC 项目

打开Visual Studio 2019、 点击创建新项目、 在列表中找到:ASP.NET Web应用程序(.NET Framework):用于创建ASP.NET应用程序的项目模板。你可以创建ASP.NET Web Forms、MVC或Web API应用程序,并可以在ASP.NET中添加许多其他功能、 输入项目名称、输入存储位置、输入解决方…

挂耳式蓝牙耳机哪家的好用,列举五款舒适度极佳的耳机分享

谈到骨传导耳机&#xff0c;相信大家都会想到不入耳的佩戴设计&#xff0c;因为这个特性让骨传导耳机迅速席卷整个年轻一代的圈子&#xff0c;相比于传统式的耳机&#xff0c;骨传导耳机在一定程度上是对耳道是具有一定的保护&#xff0c;这也就是为什么骨传导耳机深受群众喜爱…

深入理解Linux网络技术内幕(九)——中断和网络驱动程序

文章目录前言决策和流量方向接收到帧时通知驱动程序轮询中断在中断期间处理多帧定时器驱动的中断事件组合范例中断处理函数下半部函数存在的原因下半部解决方案并发和上锁抢占功能下半部函数微任务软IRQ初始化未决软IRQ的处理__do_softirq函数依体系结构处理软IRQksoftirqd内核…

优维EasyOps,打造新一代运维新方式

数字经济时代&#xff0c;数字技术与企业业务深度融合&#xff0c;越来越多企业开始认识到&#xff0c;IT正在从内部的支撑工具转变为企业发展的核心竞争力。然而&#xff0c;面对信息建设不断深化、系统架构日趋复杂、新兴技术快速迭代等诸多挑战&#xff0c;企业如何在复杂的…

mini-Imagenet处理

由于imagenet-1k 数据集太大&#xff0c;在验证模型方面耗时太久&#xff0c;特意研究了一下mini-Imagenet&#xff0c;用来代替imageNet-1K数据集。 2016年google DeepMind团队从Imagnet数据集中抽取的一小部分&#xff08;大小约3GB&#xff09;制作了Mini-Imagenet数据集&a…

TrustSVD算法进行基于矩阵分解的商品推荐 代码+数据(可作为毕设)

案例简介 (1)方法概述: 本教程包含如下内容: 从原始的数据文件中加载数据,进行训练集和测试集的切分,并对测试集进行负采样。 对数据分batch, 利用用户历史点击记录进行模型训练 结果展示 数据集:https://download.csdn.net/download/qq_38735017/87154848 (2)宏观流程图 …