react中受控组件与非受控组件

受控组件与非受控组件

受控组件:

其值由 React 控制的组件,通常使用 state 来控制和修改组件的值。

例如受控的 组件:

class NameForm extends React.Component {constructor(props) {super(props);this.state = {value: ''};}handleChange = (event) => {this.setState({value: event.target.value});  }render() {return (<input value={this.state.value} onChange={this.handleChange} />);}
}

输入的值通过状态state来控制,onChange 也会更新状态,所以组件受 React 的控制。

非受控组件:

其值未由 React 管理和控制的组件,通常使用 refs 来访问 DOM 元素获取值。

例如非受控的 :

class NameForm extends React.Component {constructor(props) {super(props);this.input = React.createRef();}handleSubmit = () => {const value = this.input.current.value;}render() {return (<inputtype="text"ref={this.input} />);}
}

输入的值未绑定到 state,需要手动通过 ref 读取,所以不是由 React 控制的。

ref的使用

在React中,ref被用来获取组件或者DOM元素的引用。常见的使用方式有以下几种:

  1. 创建ref

使用React.createRef()创建ref:

const myRef = React.createRef();
  1. 挂载ref到组件/元素

通过ref属性将ref挂载到组件/元素上:

<input ref={myRef} /><MyComponent ref={myRef} />
  1. 访问ref

通过ref的current属性访问到对应的组件或DOM元素:

const element = myRef.current;
element.focus(); // 对应的DOM元素

当ref挂载完成后,ref.current会指向对应的组件或DOM元素。

  1. 在类组件中的使用

在类组件中可以在构造函数中创建ref,并通过this访问:

class MyComponent extends React.Component {constructor(props) {super(props);this.myRef = React.createRef(); }render() {return <div ref={this.myRef} />;}componentDidMount() {const node = this.myRef.current;}  
}
  1. 在函数组件中使用

在函数组件中可以通过useRef钩子创建和访问:

function MyComponent() {const myRef = useRef();useEffect(() => {const node = myRef.current;}) return <div ref={myRef} />;
}

注意
在 React 中使用 ref 需要注意以下几点:

  1. 避免过度使用 ref

不要在组件中大面积使用 ref,组件应该越“无状态”越好。ref 主要适用于必须访问 DOM 元素的特殊场景。

  1. 不要在函数组件中暴露 ref

函数组件没有实例,它的 ref 会在每次渲染时发生变化,可能导致奇怪的 bug。

  1. ref 不会自动绑定

当组件重新渲染时,ref 不会自动变化,需要在组件加载和卸载时手动更新。

  1. 将 ref 传递给 DOM 元素时要注意泄露风险

如果组件被卸载但其 ref 仍在使用,会导致内存泄露。可以在组件卸载时手动将 ref 的 current 属性置为 null。

  1. 避免在渲染期间设置 ref

不要在函数组件主体或 class 组件 render 方法中设置 ref,这可能导致 ref 不一致。应在加载后才设置 ref。

  1. 将 ref 回调与 useEffect 配合使用。可以在 useEffect 中设置或重置 ref,以避免上述问题。

  2. 在严格模式下使用 ref 会抛出警告,需要用 React.forwardRef 处理。

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

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

相关文章

K8s的Pod出现Init:ImagePullBackOff问题的解决(以calico为例)

对于这类问题的解决思路应该都差不多&#xff0c;本文以calico插件安装为例&#xff0c;发现有个Pod的镜像没有pull成功 第一步&#xff1a;查看这个pod的描述信息 kubectl describe pod calico-node-wmhrw -n kube-system 从上图发现是docker拉取"calico/cni:v3.15.1&q…

Redis面试题总结

1.什么是Redis Redis 是一种基于内存的数据库对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、Hash(哈希)、…

Ubuntu 20.04.5 怎么安装微信

这是我的ubutun版本号 在这个系统装桌面版微信很多功能不健全。搜索了很多方法&#xff0c;这个算是不错的一个法子。 1.添加仓库 首次使用时&#xff0c;你需要运行如下一条命令将移植仓库添加到系统中。 wget -O- https://deepin-wine.i-m.dev/setup.sh | sh 2.应用安装 …

【C语言】文件操作详解

文章目录 前言一、文件是什么二、文件具体介绍1.文件名2.文件类型3.文件缓冲区4.文件指针5.文件的打开和关闭 三、文件的顺序读写1.字符输入函数&#xff08;fgetc&#xff09;2.字符输出函数&#xff08;fputc&#xff09;3.文本行输入函数&#xff08;fgets&#xff09;4.文本…

基于MQTT协议的物联网关

随着工业领域的不断发展&#xff0c;数字化转型已经成为企业迈向未来的必由之路。在这个数字化浪潮中&#xff0c;HiWoo Box以其强大的功能和创新的设计&#xff0c;在工业物联网领域被越来越多的人所熟知。特别是其基于MQTT协议的物联网关能力&#xff0c;也为企业实现智能化数…

网络媒介素养研究及其教育

我们知道网络传播作为第四媒体不同于传统的大众传播媒体&#xff0c;网络不仅仅是人 际传播与大众传播的综合体&#xff0c;也是多媒体传播的复合体。即网络传播的文本特征是 多媒体传播&#xff0c;以超链接的形式集文字、影像、音频、视频于一体。这就要求网民以 不同的技…

Centos7本地安装Docker-compose

考虑github时常出现问题。以下内容是基于本地安装 安装包地址 文章参考链接 1、下载安装包上传包到/usr/local/bin 2、执行命令 # 修改权限 chmod x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose3、验证是否安装成功 docker-…

制作 linux .deb 安装包

文章目录 打包controlpostinstpostrmTestApp.shTestApp.desktop生成安装包安装.deb卸载 [Qt 发布应用程序](https://blog.csdn.net/u012020854/article/details/52597226?spm1001.2014.3001.5502) 新增文件夹 packages 打包 packages ├── DEBIAN │ └── control #详情看…

「操作系统」1. 基础

前言&#xff1a;操作系统基础八股文 文章目录 一 、操作系统基础1.1 什么是操作系统&#xff1f;1.2 什么是系统调用1.3 什么是中断 &#x1f680; 作者简介&#xff1a;作为某云服务提供商的后端开发人员&#xff0c;我将在这里与大家简要分享一些实用的开发小技巧。在我的职…

使用 python 源码搭建 conda 环境

今天需要使用 python 2.6.8 的环境&#xff0c;发现 conda 设置成清华源后&#xff0c;没有旧版本了。所以打算从官网上下载一份 python 进行安装&#xff0c; 结果发现&#xff0c;conda 不能直接安装离线包&#xff08;也可能我没找到方法&#xff09;&#xff0c;经过一番尝…

既能够用ffmpeg命令做RTSP流转RTMP流,又可以像调用avcodec/avfilter库一样逻辑编程

又有一个需求&#xff1a;我们现在想做一款多路RTSP拉流转RTMP推流到CDN进行直播的功能&#xff0c;注意啊&#xff0c;是多路&#xff0c;原来我们有两种方式&#xff0c;一种是用ffmpeg.exe进行&#xff1a; ffmpeg -i “rtsp://192.168.0.99:8554/1” -c:v libx264 -c:a aac…

java 多线程

01.多线程类java.lang.Thread 这里继承Thread类的方法是比较常用的一种&#xff0c;如果说你只是想起一条线程。没有什么其它特殊的要求&#xff0c;那么可以使用Thread.&#xff08;笔者推荐使用Runable&#xff0c;后头会说明为什么&#xff09;。下面来看一个简单的实例&…

Vue结合ElementUi修改<el-table>表格的背景颜色和表头样式

本项目在开发过程中vueelementui &#xff0c; 页面中使用了table表格的样式&#xff0c; 需要对原先的样式进行修改&#xff0c;以下是简单的修改样式内容&#xff1a;项目中某个 html中引用的table表格内容,定义了div的class : device_err :<div class"device_err&q…

成集云 | 钉钉财务费用单同步至畅捷通 | 解决方案

源系统成集云目标系统 方案介绍 财务管理作为企业管理中重要的组成部分&#xff0c;在企业的发展和成长中扮演着重要角色&#xff0c;成集云以钉钉费用单OA审批与畅捷通TCloud系统为例&#xff0c;与钉钉连接器深度融合&#xff0c;通过数据处理和字段匹配实现了费用…

【核磁共振成像】相位差重建

目录 一、相位差map重建一般步骤和反正切函数主值范围二、反正切运算三、可预期相位误差和伴随场的校正四、图形变形校正 一、相位差map重建一般步骤和反正切函数主值范围 MRI是一个相敏成像模态&#xff0c;MR原始数据傅里叶变换后的复数图像中每个像素值有模和相位。标准模重…

PL端DDR4读写测试实验(未完成)

文章目录 DDR4介绍实验过程编写XDC使用IP核上板验证TODO 参考 DDR4介绍 开发板PL有一颗16bit的DDR4。 先说明硬件信号&#xff08;按该芯片&#xff09;&#xff1a; 信号名说明DQData input/output&#xff0c;双向数据线&#xff08;这个芯片是x16的&#xff0c;使用DQ[15…

Gradle 如何配置全局 mavenCentral()

我们都知道 Gradle 会使用 Maven 的中央仓库。 在 Gradle 的配置文件中&#xff0c;通常有一个 mavenCentral() 如果我们想把 mavenCentral() 的仓库地址全局替换掉别的仓库地址的话。 我们可以在 C:\Users\yhu\.gradle 目录下创建一个 init.gradle 文件。 文件中的代码为&a…

原生小程序 wxs 语法(详细)

WXS WXS&#xff08;WeiXin Script&#xff09;是内联在 WXML 中的脚本段。通过 WXS 可以在模版中内联少量处理脚本&#xff0c;丰富模板的数据预处理能力。另外&#xff0c; WXS 还可以用来编写简单的 WXS 事件响应函数。 从语法上看&#xff0c; WXS 类似于有少量限制的 Java…

Java 正则表达式

一、概念 正则表达式&#xff0c;又称规则表达式&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xff09;&#xff0c;正则表达式使用单个字符串来描述、匹配…

JAVA类和对象

如何创建类 ⚠Java当中一切皆对象 ⚠如何描述对象&#xff1f;用类。 我们可以类当成一个模板&#xff0c;用来描述对象特征&#xff0c;行为等等 //自定义的类型 -> 你定义的一个 Java当中 没有的类型 class PetDog {public String name;//名字public String color;//颜…