react 受控组件和非受控组件

ops/2024/11/19 13:16:45/

在 React 中,受控组件和非受控组件是两种处理表单元素(如输入框、选择框等)值的方式。

1. 受控组件

受控组件是指 React 组件的表单元素的值是由 React 组件的 state 来管理的。换句话说,React 会全程控制表单元素的值,每当输入框的内容发生变化时,都会触发事件(如 onChange),并更新组件的 state,从而使组件重新渲染。

特点:

  • 表单的值由 React 的 state 控制。
  • 必须通过 state 和 setState 来读取和修改表单元素的值。
  • 更容易实现表单验证和其他交互逻辑。

示例:

import React, { useState } from 'react';function ControlledInput() {const [value, setValue] = useState('');const handleChange = (e) => {setValue(e.target.value);  // 更新 state};return (<inputtype="text"value={value}          // 由 state 控制值onChange={handleChange} // 更新 state/>);}

2. 非受控组件(Uncontrolled Component)

非受控组件是指表单元素的值不受 React state 的控制,而是通过 DOM 元素的本地状态来处理。这意味着 React 不会直接管理表单元素的值,值的管理交由 DOM 本身来控制。

特点:

  • 表单的值由 DOM 控制,而非 React state。
  • 可以通过 ref 获取当前表单元素的值,而不需要设置 value 和 onChange 处理事件。
  • 更接近传统的 HTML 表单操作方式,适合简单场景。

示例:

import React, { useRef } from 'react';function UncontrolledInput() {const inputRef = useRef(null);const handleSubmit = (e) => {e.preventDefault();alert('输入的值是: ' + inputRef.current.value); // 使用 ref 获取值};return (<form onSubmit={handleSubmit}><input type="text" ref={inputRef} />  {/* 不需要 value 和 onChange */}<button type="submit">提交</button></form>);
}

总结:

  • 受控组件适用于复杂的交互场景(如表单验证、动态表单等),可以让 React 完全控制表单的行为。
  • 非受控组件适用于简单场景,尤其是当表单不需要频繁的与 React 的 state 交互时。

http://www.ppmy.cn/ops/134976.html

相关文章

C 语言 【单链表】

单链表是一种基本的数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含数据域和指针域。‌数据域用于存储实际的数据&#xff0c;而指针域则存储指向下一个节点的地址。单链表的特点包括动态存储、非连续存储、易于插入和删除。 节点可以定义成一个结构体&#xff…

NFS存储基础操作

一、安装nfs客户端 Windows安装 在windows 启用和关闭Windows功能中将nfs服务和下面的nfs客户端和管理工具勾选 Linux安装 ubuntu sudo apt update sudo apt install nfs-common不安装挂载的时候会报错 $ sudo mount -t nfs4 192.168.100.5:/mnt/share/nfs /mnt/nfs moun…

3 设计模式原则之依赖倒置原则

一、依赖倒置原则 1.定义 高层模块不应该依赖低层模块&#xff0c;两者都应该依赖其抽象&#xff1b; 抽象不应该依赖细节&#xff0c;细节应该依赖抽象。 简单的说&#xff1a;面向接口编程&#xff0c;而不是面向实现编程。通过依赖于抽象&#xff0c;系统可以更加灵活、易于…

【C++之STL】摸清 string 的模拟实现(上)

文章目录 1. 为什么要模拟实现&#xff1f;2. 基本框架搭建3. 构造函数3. 1 默认构造/from c_str3. 2 拷贝构造3. 2. 1 深浅拷贝 3. 3 fill3. 4 迭代器区间构造 4. 容量操作4. 1 size()和capacity()和empty()4. 2 clear()4. 3 resize()4. 4 reserve() 1. 为什么要模拟实现&…

【Electron】总结:如何创建Electron+Element Plus的项目

目录 一、准备环境 二、创建Element项目 三、添加依赖 四、配置页面 五、安装Element-plus 六、配置页面 七、生成安装包 八、增加支持TypeScript 我将结合官网手册与AI问到的信息&#xff0c;直接给出步骤&#xff0c;与命令。 一、准备环境 首先在C盘Users&#xf…

游戏引擎学习第九天

视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据&#xff0c;改播放正弦波 下面主要讲关于浮点数 1. char&#xff08;字符类型&#xff09; 大小&#xff1a;1 字节&#xff08;8 位&#xff09;表示方式&#xff1a;char 存储的是一个字符的 A…

数据结构——重排链表(经典题目,涉及三个知识点)

一、示例 二、上代码 class Solution { public:void reorderList(ListNode* head) {if (head nullptr || head->next nullptr) return;ListNode* mid FindMiddleNode(head); // 找到中间节点ListNode* l1 head;ListNode* l2 mid->next;mid->next nullptr;l2…

shell中的case语句和循环语句

文章目录 &#x1f34a;自我介绍&#x1f34a;shell中的case语句匹配常量匹配变量匹配字符串列表 &#x1f34a;循环语句while 循环for 循环单词表通过逐个列出单词通过变量中的数据通过命令行传输单词表 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点…