当前位置: 首页 > news >正文

【React】受控组件和非受控组件

目录

  • 受控组件
  • 非受控组件
    • 基于ref获取DOM元素
      • 1、在标签中使用
      • 2、在组件中使用

受控组件

表单元素的状态(值)由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值,并且每次用户输入时,React 通过事件处理程序来更新 state,从更改视图「推荐」。

非受控组件

基于ref获取DOM元素,我们操作DOM元素,来实现需求和效果「偶尔」。

基于ref获取DOM元素

1、在标签中使用

(1)ref="xxx"「 16.3 版本以后已经不推荐使用」
给需要的元素设置ref="xxx",基于this.refs.xxx获取相应的DOM,但是在React.StrictMode模式下会报错

//使用<h2 ref="titleBox">...</h2>//获取this.refs.titleBox

(2)把ref设置成函数

  • x是形参:存储当前的DOM元素
  • 获取DOM元素的x直接挂在实例的某个属性
//使用
ref={x=>this.xxx = x}
//获取
this.xxx

(3)基于React.createRef方法创建一个ref对象
React.createRef() 在类组件中创建对 DOM 元素或其他组件实例的引用,可以直接访问或操作 DOM 元素

this.xxx = React.createRef(); // ==> this.xxx = {current:null}//使用
ref={ref对象(this.xxx)}
//获取
this.xxx.current

全部代码如下:

class Demo extends React.Component {box3 = React.createRef(); //this.box3=xxxrender() {return <div><h2 className="title" ref="titleBox">温馨提示</h2><h2 className="title" ref={x => this.box2 = x}>友情提示</h2><h2 className="title" ref={this.box3}>郑重提示</h2></div>;}componentDidMount() {// 第一次渲染完毕「virtualDOM已经变为真实DOM」:此时我们可以获取需要操作的DOM元素console.log(this.refs);//{titleBox: h2.title}console.log(this.box2);//<h2 class="title">友情提示</h2>console.log(this.box3);//{current: h2.title}}
}

原理:
在render渲染的时候,会获取virtualDOM的ref属性

  • 如果属性值是一个字符串,则会给this.refs增加这样的一个成员,成员值就是当前的DOM元素
  • 如果属性值是一个函数,则会把函数执行,把当前DOM元素传递给这个函数「x->DOM元素」,而在函数执行的内部,一般都会把DOM元素直接挂在到实例的某个属性上
  • 如果属性值是一个REF对象,则会把DOM元素赋值给对象的current属性

2、在组件中使用

  • 给元素标签设置ref,目的:获取对应的DOM元素
  • 给类组件设置ref,目的:获取当前调用组件创建的实例「后续可以根据实例获取子组件中的相关信息」
  • 给函数组件设置ref,直接报错:Function components cannot be given refs. Attempts to access this ref will fail.
    • 但是我们让其配合 React.forwardRef 实现ref的转发
    • 目的:获取函数子组件内部的某个元素

React.forwardRef 用法:forwardRef 接受一个函数作为参数,这个函数有两个参数:props 和 ref。ref 会被传递给子组件的某个 DOM 元素(或者其他组件实例)。

class Child1 extends React.Component {state = {x: 100,y: 200};render() {return <div>子组件1<em ref={x => this.emBox = x}>100</em></div>;}
}const Child2 = React.forwardRef(function Child2(props, ref) {// console.log(ref); //我们调用Child2的时候,设置的ref属性值「函数」 //打印的结果为: x => this.child2 = xreturn <div>子组件2<button ref={ref}>按钮</button></div>;
});class Demo extends React.Component {render() {return <div><Child1 ref={x => this.child1 = x} /><Child2 ref={x => this.child2 = x} /></div>;}componentDidMount() { console.log(this.child1); //存储的是:子组件的实例对象console.log(this.child2); //存储的是:子组件内部的button按钮}
}

组件Demo 中打印的this.child1this.child2,如下:
在这里插入图片描述

相关文章:

【React】受控组件和非受控组件

目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态&#xff08;值&#xff09;由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值&#xff0c;并且每次用户输入时&#xff0c;React 通过事件处理程序来更新 …...

Ollama+deepseek+Docker+Open WebUI实现与AI聊天

1、下载并安装Ollama 官方网址&#xff1a;Ollama 安装好后&#xff0c;在命令行输入&#xff0c; ollama --version 返回以下信息&#xff0c;则表明安装成功&#xff0c; 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例&#xff0c; 在命令行中&#xff0c;执行&…...

DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化

随着深度学习&#xff08;DeepSeek&#xff09;、GPT等先进AI技术的出现&#xff0c;工厂的数字化架构正在经历前所未有的变革。AI的强大处理能力、预测能力和自动化决策支持&#xff0c;将大幅度提升生产效率、设备管理、资源调度以及产品质量管理。本文将探讨AI体&#xff08…...

阿莱(arri)mxf文件变0字节的恢复方法

阿莱(arri)是专业级的影视产品软硬件供应商&#xff0c;很多影视作品都是使用阿莱(arri)的设备拍摄出来的。总体上来讲阿莱(arri)的文件格式有mov和mxf两种&#xff0c;这次恢复的是阿莱(arri)的mxf&#xff0c;机型是arri mini,素材保存在一个8t的硬盘上&#xff0c;使用的是e…...

初识 Node.js

在当今快速发展的互联网技术领域&#xff0c;Node.js 已经成为了一个非常流行且强大的平台。无论是构建高性能的网络应用、实时协作工具还是微服务架构&#xff0c;Node.js 都展示了其独特的优势。本文将带您走进 Node.js 的世界&#xff0c;了解它的基本概念、核心特性以及如何…...

debug-vscode调试方法

debug - vscode gdb调试指南 文章目录 debug - vscode gdb调试指南前言一、调试代码二、命令查看main反汇编查看寄存器打印某个变量打印寄存器&#xff0c;如pc打印当前函数栈信息&#xff08;当前执行位置&#xff09;打印程序栈局部变量x命令的语法如下所示&#xff1a;打印某…...

Cypher进阶(函数、索引)

文章目录 Cypher进阶Aggregationcount()函数统计函数collect()函数 unwindforeachmergeunionload csvcall 函数断言函数all()any()~~exists()~~is not nullnone()single() 标量函数coalesce()startNode()/endNode()id()length()size() 列表函数nodes()keys()range()reduce() 数…...

XML Schema 数值数据类型

XML Schema 数值数据类型 引言 XML Schema 是一种用于描述 XML 文档结构的语言。它定义了 XML 文档中数据的有效性和结构。在 XML Schema 中,数值数据类型是非常重要的一部分,它定义了 XML 文档中可以包含的数值类型。本文将详细介绍 XML Schema 中常用的数值数据类型,以及…...

Window获取界面空闲时间

‌GetLastInputInfo‌是一种Windows API函数&#xff0c;用于获取上次输入操作的时间。 该函数通过LASTINPUTINFO结构返回最后一次输入事件的时间。 原型如下 BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii);那么可以利用GetLastInputInfo来得到界面没有操作的时长 uint…...

Java进阶(vue基础)

目录 1.vue简单入门 ?1.1.创建一个vue程序 1.2.使用Component模板(组件&#xff09; 1.3.引入AXOIS ?1.4.vue的Methods&#xff08;方法&#xff09; 和?compoted&#xff08;计算&#xff09; 1.5.插槽slot 1.6.创建自定义事件? 2.Vue脚手架安装? 3.Element-UI的…...

Mac电脑上好用的压缩软件

在Mac电脑上&#xff0c;有许多优秀的压缩软件可供选择&#xff0c;这些软件不仅支持多种压缩格式&#xff0c;还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件&#xff1a; BetterZip 功能特点&#xff1a;BetterZip 是一款功能强大的压缩和解压缩工具&a…...

Ubuntn24.04安装

1.镜像下载 https://cn.ubuntu.com/download Ubuntu 24.04.1 (Noble Numbat) 进入下载即可 2.安装系统 打开虚拟机 选择语言 输入用户名和密码 安装ssh 安装完成重启即可。 3.可能出现的问题 关于Ubuntu系统虚拟机出现频繁闪屏&#xff0c;移动和屏幕适应大小问题_vmware安…...

基于ansible部署elk集群

ansible部署 ELK部署 ELK常见架构 &#xff08;1&#xff09;ElasticsearchLogstashKibana&#xff1a;这种架构是最常见的一种&#xff0c;也是最简单的一种架构&#xff0c;这种架构通过Logstash收集日志&#xff0c;运用Elasticsearch分析日志&#xff0c;最后通过Kibana中…...

解锁.NET Fiddle:在线编程的神奇之旅

在.NET 开发的广袤领域中&#xff0c;快速验证想法、测试代码片段以及便捷地分享代码是开发者们日常工作中不可或缺的环节。而.NET Fiddle 作为一款卓越的在线神器&#xff0c;正逐渐成为众多.NET 开发者的得力助手。它打破了传统开发模式中对本地开发环境的依赖&#xff0c;让…...

记录pve中使用libvirt创建虚拟机

pve中创建虚拟机 首先在pve网页中创建一个linux虚拟机&#xff0c;我用的是debian系统&#xff0c;过程省略 注意虚拟机cpu类型要设置为host 检查是否支持虚拟化 ssh分别进入pve和debian虚拟机 检查cpu是否支持虚拟化 egrep --color vmx|svm /proc/cpuinfo # 结果高亮显示…...

【HTML性能优化】提升网站加载速度:GZIP、懒加载与资源合并

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 02-HTML常见文本标签解析&#xff1a;从基础到进阶的全面指南 03-HTML从入门到精通&#xff1a;链接与图像标签全解析 04-HTML 列表标签全解析&#xff1a;无序与有序列表的深度应用 05-HTML表格标签全面…...

三维空间全局光照 | 及各种扫盲

Lecture 6 SH for diffuse transport Lecture 7关于 SH for glossy transport 三维空间全局光照 diffuse case和glossy case的区别 在Lambertian模型中&#xff0c;BRDF是一个常数 diffuse case 跟outgoing point无关 glossy case 跟outgoing point有关 &#xff08;Gloss…...

数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

10.6. 数据库开发常识 作为一名专业数据库开发人员&#xff0c;不但需要掌握数据库开发相关的语法和功能实现&#xff0c;还要掌握专业数据库开发的常识。这样&#xff0c;才能在保量完成工作任务的同时&#xff0c;也保质的完成工作任务&#xff0c;避免了为应用的日后维护埋…...

网络爬虫js逆向之某音乐平台案例

【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; - 本章主要讲解某音乐平台的js逆向知识 - 使用关键字搜定位加密入口 - 通过多篇文章【文字案例】的形式系统化进行描述 - 本文章全文进行了脱敏处理 - 详细代码不进行展示&#xff0c;需要则私聊作者 爬虫js逆向…...

Spark--算子执行原理

一、sortByKey SortByKey是一个transformation算子&#xff0c;但是会触发action&#xff0c;因为在sortByKey方法内部&#xff0c;会对每个分区进行采样&#xff0c;构建分区规则&#xff08;RangePartitioner&#xff09;。 内部执行流程 1、创建RangePartitioner part&…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...