【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.child1,this.child2,如下:

相关文章:
【React】受控组件和非受控组件
目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态(值)由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值,并且每次用户输入时,React 通过事件处理程序来更新 …...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter2-HTML 中的 JavaScript
二、HTML 中的 JavaScript 将 JavaScript 插入 HTML 的主要方法是使用<script>元素。 <script>元素有下列 8 个属性。 async:可选。表示应该立即开始下载脚本,但不能阻止其他页面动作,比如下载资源或等待其他脚本加载。只对外部…...
tcpdump 的工作层次
理解 tcpdump 的工作层次需要结合 网络分层模型 和 数据包捕获机制(如 pcap)来回答。以下是详细的解释: 物理层 vs. 数据链路层 物理层(Physical Layer,OSI 第1层) 负责传输原始比特流(如电信号…...
vue2:如何动态控制el-form-item之间的行间距
需求 某页面有查看和编辑两种状态: 编辑: 查看: 可以看到,查看时,行间距太大导致页面不紧凑,所以希望缩小查看是的行间距。 行间距设置 行间距通常是通过 CSS 的 margin 或 padding 属性来控制的。在 Element UI 的样式表中,.el-form-item 的下边距(margin-bottom)…...
亚博microros小车-原生ubuntu支持系列:20 ROS Robot APP建图
依赖工程 新建工程laserscan_to_point_publisher src/laserscan_to_point_publisher/laserscan_to_point_publisher/目录下新建文件laserscan_to_point_publish.py #!/usr/bin/env python3import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStam…...
计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Qt最新热点
Qt的最新热点主要集中在以下几个方面: 跨平台开发:Qt继续强调其在跨平台开发方面的优势,支持在Windows、macOS、Linux以及移动操作系统(如Android和iOS)上的应用开发。 Qt for Python:Qt for Python(PySide2和PySide6)的发展,为Python开发者提供了更强大的工具来创建桌…...
k8sollama部署deepseek-R1模型,内网无坑
这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…...
音频录制一般在什么情况下会选择保存为PCM?什么情况会选择保存为WAV?
在音频开发中,选择保存为 PCM 或 WAV 格式取决于具体的应用场景和需求。以下是两种格式的特点以及适用场景的分析: PCM 格式 特点: 原始音频数据: PCM 是未压缩的原始音频数据,没有任何文件头或元数据。数据直接以二进制形式存储,通常是采样点的值。文件体积较大: 由于…...
【Elasticsearch】nested聚合
在 Elasticsearch 中,嵌套聚合(nestedaggregation)的语法形式用于对嵌套字段(nestedfields)进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型,用于存储数组中的对象,这些对象需要独…...
从零创建 Vue 3 项目
Vue 3 作为当前最流行的前端框架之一,提供了多种创建项目的方式。本文将详细介绍七种常见的创建 Vue 3 项目的方法,涵盖从本地开发到在线编辑器的多种场景,帮助您选择最适合的方式 快速创建 Vue 3项目 进行开发。 方法一:使用 Vue…...
Day48_20250130【回校继续打卡】_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II
Day48_20250130_单调栈part1_739.每日温度|496.下一个更大元素I|503.下一个更大元素II 20250130补完 739.每日温度 题目 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天࿰…...
spy-debugger + Charles 调试移动端/内嵌小程序H5
简介说明: PC端可以用F12进行console等进行调试,但移动端App中使用webview就无法进行实时调试,针对这种情况 1. 安装 全局安装 spy-debugger sudo npm install spy-debugger -g // window不用加sudo2. spy-debugger 证书 其实spy-debugg…...
【NLP 20、Encoding编码 和 Embedding嵌入】
目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码(One-Hot Encoding) (2) 位置编码(Positional Encoding) (3) 标签编码(Label Encoding) (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入…...
【LeetCode 刷题】二叉树(3)-二叉树的属性
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为二叉树的属性相关的题目解析。 文章目录 101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数110.平衡二叉树257. 二叉树的所有路径404.左叶子之和513.找树左下角的值112. 路…...
深度学习模型可视化小工具wandb
1 概述 Wandb(Weights & Biases,网址是https://wandb.ai)是一个用于机器学习项目实验跟踪、可视化和管理的工具,旨在用户更有效地监控模型训练过程、优化性能,并分享和复现实验结果。对于使用者而言ÿ…...
数据库系统概论的第六版与第五版的区别,附pdf
我用夸克网盘分享了「数据库系统概论第五六版资源」,点击链接即可保存。 链接:https://pan.quark.cn/s/21a278378dee 第6版教材修订的主要内容 为了保持科学性、先进性和实用性,在第5版教材基础上对全书内容进行了修改、更新和充实。 在科…...
【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…...
python:csv文件批量导入mysql
1.导入sql文件到数据库中 mysql -u username -p要先创建一个空的数据库 CREATE DATABASE your_database_name;USE your_database_name;导入sql文件 source /path/to/your/file.sql;查看某个表格的结构,为后续数据插入做准备 DESCRIBE table_name;2.插入假数据到对应…...
软件设计模式
目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…...
C++证件识别接口-身份证识别-护照识别-驾驶证识别-户口页识别
数字化信息时代,快速准确地处理各类证件信息已经成为许多行业提升效率的关键。无论是金融、物流、旅游还是公共服务领域,证件识别接口的应用极大的简化了证件信息提取的流程,提高了录入效率。 证件识别接口提升业务处理效率 传统的人工审核…...
3步打造C# API安全密盾
引言:API 安全的重要性 在数字化浪潮中,应用程序编程接口(API)已成为不同软件系统之间通信和数据交互的关键桥梁。无论是企业内部的微服务架构,还是面向外部用户的在线服务,API 都承担着数据传输和业务逻辑…...
vscode 如何通过Continue引入AI 助手deepseek
第一步: 在deepseek 官网上注册账号,得到APIKeys(deepseek官网地址) 创建属于自己的APIKey,然后复制这个key,(注意保存自己的key)! 第二步: 打开vscode,在插件市场安装Continue插件, 点击设置,添加deepseek模型,默认…...
通过docker安装部署deepseek以及python实现
前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…...
iOS 音频录制、播放与格式转换
iOS 音频录制、播放与格式转换:基于 AVFoundation 和 FFmpegKit 的实现 在 iOS 开发中,音频处理是一个非常常见的需求,比如录音、播放音频、音频格式转换等。本文将详细解读一段基于 AVFoundation 和 FFmpegKit 的代码,展示如何实现音频录制、播放以及 PCM 和 AAC 格式之间…...
RK3576——USB3.2 OTG无法识别到USB设备
问题:使用硬盘接入到OTG接口无热插拔信息,接入DP显示屏无法正常识别到显示设备,但是能通过RKDdevTool工具烧录系统。 问题分析:由于热插拔功能实现是靠HUSB311芯片完成的,因此需要先确保HUSB311芯片驱动正常工作。 1. …...
【MySQL】语言连接
语言连接 一、下载二、mysql_get_client_info1、函数2、介绍3、示例 三、其他函数1、mysql_init2、mysql_real_connect3、mysql_query4、mysql_store_result5、mysql_free_result6、mysql_num_fields7、mysql_num_rows8、mysql_fetch_fields9、mysql_fetch_row10、mysql_close …...
20240206 adb 连不上手机解决办法
Step 1: lsusb 确认电脑 usb 端口能识别设备 lsusb不知道设备有没有连上,就插拔一下,对比观察多了/少了哪个设备。 Step 2: 重启 adb server sudo adb kill-serversudo adb start-serveradb devices基本上就可以了~ Reference https://b…...
何为运行时(Runtime)
Runtime(运行时) 是计算机程序中实际执行的阶段,指从程序启动到终止的整个运行过程。它涵盖了程序运行所需的环境、资源管理和底层支持机制。 1. 核心概念 运行时环境(Runtime Environment) 程序运行依赖的基础设施&am…...
基于ansible部署elk集群
ansible部署 ELK部署 ELK常见架构 (1)ElasticsearchLogstashKibana:这种架构是最常见的一种,也是最简单的一种架构,这种架构通过Logstash收集日志,运用Elasticsearch分析日志,最后通过Kibana中…...
