对受控组件和非受控组件的理解?应用场景?

devtools/2025/1/16 7:54:59/

受控组件与非受控组件的理解与应用

在 React 中,组件可以通过两种方式管理表单元素的状态:受控组件非受控组件。这两者在处理表单输入数据时有很大的区别,理解它们的应用场景和优劣对于开发者来说非常重要。

目录结构:

  1. 受控组件与非受控组件概述
  2. 受控组件(Controlled Component)详解
    • 2.1 受控组件的特点
    • 2.2 受控组件的应用场景
    • 2.3 受控组件的实际代码示例
  3. 非受控组件(Uncontrolled Component)详解
    • 3.1 非受控组件的特点
    • 3.2 非受控组件的应用场景
    • 3.3 非受控组件的实际代码示例
  4. 受控组件与非受控组件的区别
    • 4.1 状态管理方式
    • 4.2 数据流和表单控制
    • 4.3 性能和灵活性
  5. 总结

受控组件与非受控组件概述

受控组件非受控组件都涉及到 React 中的表单元素(如 <input>, <select>, <textarea> 等)的状态管理。

  • 受控组件是指由 React 管理表单元素的值,所有的表单数据都保存在 React 组件的状态中。任何表单元素的更新都通过 React 的 state 来管理。

  • 非受控组件是指表单元素的状态不由 React 管理,而是由 DOM 来管理。你可以通过 React 的 ref 获取或操作这些元素的值。


受控组件(Controlled Component)详解

2.1 受控组件的特点
  • 在受控组件中,表单元素的值是由 React 的 state 来控制的。
  • 每当表单输入发生变化时,React 会更新组件的状态,从而触发重新渲染。
  • 受控组件通常通过 valueonChange 事件来处理输入。
2.2 受控组件的应用场景
  • 当需要对表单数据进行校验、格式化或跟踪时,受控组件是一个非常好的选择。
  • 需要将表单数据发送到服务器或进行复杂的逻辑处理时,受控组件也很适用。
  • 需要获取多个表单字段值,或者在表单提交前需要统一处理时,使用受控组件可以确保数据的一致性。
2.3 受控组件的实际代码示例
import React, { useState } from 'react';const ControlledForm = () => {const [formData, setFormData] = useState({ name: '', email: '' });const handleChange = (e) => {const { name, value } = e.target;setFormData((prevData) => ({...prevData,[name]: value,}));};const handleSubmit = (e) => {e.preventDefault();alert(`提交的表单数据:${JSON.stringify(formData)}`);};return (<form onSubmit={handleSubmit}><div><label>姓名:</label><inputtype="text"name="name"value={formData.name}onChange={handleChange}/></div><div><label>邮箱:</label><inputtype="email"name="email"value={formData.email}onChange={handleChange}/></div><button type="submit">提交</button></form>);
};export default ControlledForm;

解释:

  • 组件的 formData 是通过 useState 管理的,nameemail 分别对应表单中的两个字段。
  • value 属性使得 <input> 的值与 formData 状态绑定。
  • 通过 onChange 事件更新状态,实现对输入值的控制。
  • 在表单提交时,我们可以直接从状态 formData 获取并提交数据。

非受控组件(Uncontrolled Component)详解

3.1 非受控组件的特点
  • 在非受控组件中,表单元素的状态是由 DOM 自身管理的,而 React 仅通过 ref 获取其值。
  • 不需要使用 React 的状态来管理表单数据,可以直接通过 ref 访问 DOM 元素的值。
  • 非受控组件的值只能通过访问 DOM 节点来获取,不能直接通过 React 的 state 控制其值。
3.2 非受控组件的应用场景
  • 当表单控件的状态不需要被 React 管理时,可以使用非受控组件,避免不必要的重渲染。
  • 对于简单的表单或不需要实时跟踪表单状态的场景,非受控组件是一个合适的选择。
  • 在集成第三方库或处理一些传统表单时,非受控组件可以更加轻松地与外部 DOM 操作兼容。
3.3 非受控组件的实际代码示例
import React, { useRef } from 'react';const UncontrolledForm = () => {const nameRef = useRef();const emailRef = useRef();const handleSubmit = (e) => {e.preventDefault();alert(`提交的姓名:${nameRef.current.value},邮箱:${emailRef.current.value}`);};return (<form onSubmit={handleSubmit}><div><label>姓名:</label><input type="text" ref={nameRef} /></div><div><label>邮箱:</label><input type="email" ref={emailRef} /></div><button type="submit">提交</button></form>);
};export default UncontrolledForm;

解释:

  • 组件使用 useRef 创建引用,nameRefemailRef 用于获取 <input> 元素的 DOM 引用。
  • 表单数据不通过 React 的状态管理,直接通过 ref.current.value 获取输入的值。
  • 在提交表单时,我们访问 ref 获取输入值,而不需要存储在 state 中。

受控组件与非受控组件的区别

4.1 状态管理方式
  • 受控组件:通过 React 的 state 管理表单数据,状态变化会触发重新渲染。
  • 非受控组件:通过 DOM 自身管理表单数据,React 仅通过 ref 来访问数据,不会触发重新渲染。
4.2 数据流和表单控制
  • 受控组件:数据流是单向的,所有的表单输入都通过 React 控制,适合需要实时验证或处理表单数据的场景。
  • 非受控组件:数据流不由 React 完全控制,适合不需要实时反馈的简单表单。
4.3 性能和灵活性
  • 受控组件:每次用户输入时都会更新 React 的 state,这可能导致频繁的重新渲染。对于复杂表单或有大量输入的场景,可能会影响性能。
  • 非受控组件:因为数据直接由 DOM 控制,不会频繁触发重新渲染,因此在性能上比受控组件更优。

总结

  • 受控组件使得表单输入的数据能够被 React 控制,适用于需要处理、验证或提交表单数据的场景。
  • 非受控组件则由 DOM 管理输入数据,适用于较为简单的表单场景,或当我们不需要实时操作表单数据时。
  • 在选择使用哪种组件时,考虑到表单的复杂性、性能需求以及是否需要实时验证或修改数据,可以做出合适的选择。

http://www.ppmy.cn/devtools/150882.html

相关文章

qt-C++笔记之自定义继承类初始化时涉及到parents的初始化

qt-C笔记之自定义继承类初始化时涉及到parents的初始化 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QWidget …

Linux入门——权限

shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。 而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel…

【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章ospf高级配置】理论和实操

文章目录 【网络云SRE运维开发】2025第3周-每日【2025/01/15】小测-【第14章ospf高级配置】理论和实操 14.1选择题 在H3C设备上配置OSPF时&#xff0c;以下哪个命令用于启动OSPF进程&#xff1f; A. [H3C] ospf enable B. [H3C] ospf 1 C. [H3C] ospf start D. [H3C] ospf proc…

基于华为atlas的重车(满载)空车(空载)识别

该教程主要是想摸索出华为atlas的基于ACL的推理模式。最终实现通过煤矿磅道上方的摄像头&#xff0c;识别出车辆的重车&#xff08;满载&#xff09;、空车&#xff08;空载&#xff09;情况。本质上是一个简单的检测问题。 但是整体探索过程比较坎坷&#xff0c;Tianxiaomo的…

集合帖:区间问题

一、AcWing 803&#xff1a;区间合并 &#xff08;1&#xff09;题目来源&#xff1a;https://www.acwing.com/problem/content/805/ &#xff08;2&#xff09;算法代码&#xff1a;https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…

基于YOLOv8的高空无人机小目标检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型

目标检测系统【环境搭建过程】&#xff08;GPU版本&#xff09;-CSDN博客 摘要 本文提出了一种基于YOLOv8算法的高空无人机小目标检测系统&#xff0c;利用VisDrone数据集中的7765张图片&#xff08;6903张训练集&#xff0c;862张验证集&#xff09;进行模型训练&#xff0c;…

简识MySQL的InnoDB Locking锁的分类

&#xff08; 参考官方网页&#xff1a; MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking&#xff09; 一、InnoDB Locking锁的分类&#xff1a; 锁的分类英文缩写共享锁Shared LocksS排他锁Exclusive LocksX意向共享锁Intention Shared LocksIS意向排他锁Int…

《鸿蒙Next旅游应用:人工智能赋能个性化与智能导览新体验》

随着鸿蒙Next的推出&#xff0c;旅游应用迎来了全新的发展机遇&#xff0c;借助人工智能技术能为用户带来更出色的个性化推荐和智能导览服务。 鸿蒙Next与人工智能融合优势 鸿蒙Next拥有强大的分布式能力和原生智能体验。其能打破设备界限&#xff0c;实现多设备协同&#xf…