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

学习React-21-受控组件非受控组件

### 受控组件与非受控组件

在 React 中,表单元素(如输入框、下拉菜单)的处理方式分为“受控组件”和“非受控组件”。理解它们的区别有助于优化代码结构和性能。下面我将逐步解释这两个概念、对比特点、分析优缺点,并提供使用建议和代码示例。

概念介绍
  • 受控组件:表单元素的值完全由 React 组件的状态(state)控制。每次用户输入时,都会触发状态更新,并通过事件处理函数同步数据。例如,输入框的值绑定到 state,并通过 onChange 事件更新。
  • 非受控组件:表单元素的值由 DOM 自身管理(如浏览器的默认行为)。React 通过引用(ref)在需要时(如提交表单)获取数据,而不是实时控制。
核心区别

下表总结了关键差异:

特性受控组件非受控组件
数据管理由 React 状态控制由 DOM 管理
更新方式通过 onChange 事件实时更新状态通过 ref 在特定时机(如提交)获取值
实时性高(输入时立即响应)低(仅在需要时访问)
性能影响可能较高(频繁渲染)较低(减少渲染次数)
代码复杂度较高(需事件处理逻辑)较低(简单 ref 访问)
优缺点分析
  • 受控组件优点

    • 易于实现表单验证、动态反馈(如实时显示输入长度)。
    • 与 React 状态管理无缝集成,支持复杂逻辑(如条件渲染)。
  • 受控组件缺点

    • 可能导致性能问题(每个输入都触发渲染)。
    • 代码量较大(需定义状态和事件处理函数)。
  • 非受控组件优点

    • 性能更优(减少不必要的渲染)。
    • 代码简洁(适合简单表单)。
  • 非受控组件缺点

    • 难以实时控制(如验证需手动触发)。
    • 集成 React 状态时可能出错(如与其他组件状态冲突)。
使用场景建议
  • 优先使用受控组件:当需要即时反馈、表单验证或复杂交互时(例如登录表单、动态搜索框)。
  • 优先使用非受控组件:当表单简单、性能敏感或需集成非 React 库时(例如文件上传、一次性输入)。
小栗子

以下是一个 React 组件示例,展示两种实现方式。假设我们有一个输入框,用于收集用户名。

受控组件实现:值绑定到 state,通过 onChange 更新。

import React, { useState } from 'react';function ControlledComponent() {const [username, setUsername] = useState(''); // 状态控制值const handleChange = (event) => {setUsername(event.target.value); // 实时更新状态};const handleSubmit = () => {console.log('提交的用户名:', username);};return (<div><inputtype="text"value={username} // 值由 state 提供onChange={handleChange} // 输入时触发更新/><button onClick={handleSubmit}>提交</button></div>);
}

非受控组件实现:使用 ref 在提交时获取值。

import React, { useRef } from 'react';function UncontrolledComponent() {const inputRef = useRef<HTMLInputElement>(null); // 创建 ref 引用const handleSubmit = () => {const username = inputRef.current.value; // 提交时获取 DOM 值console.log('提交的用户名:', username);};return (<div><inputtype="text"ref={inputRef} // 绑定 ref,不控制值defaultValue="" // 初始值(可选)/><button onClick={handleSubmit}>提交</button></div>);
}

总结
  • 受控组件:适合需要精细控制的场景,但注意性能优化(如使用 useCallback)。
  • 非受控组件:适合简单、高性能需求,但避免在复杂逻辑中使用。
    实际开发中,根据需求选择:多数表单推荐受控组件以确保可维护性,非受控组件可作为补充。如果您有具体场景,我可以进一步分析!受控组件&非受控组件
http://www.dtcms.com/a/512166.html

相关文章:

  • 银行测试学习计划
  • 电商自建站中企动力网站建设公司
  • 怎么搜 织梦的网站唐山海港经济开发区人才网
  • Qt打包工具Enigma Virtual Box
  • 【同步/异步 日志系统】--- 介绍
  • 【软考备考】 数据与文件的加解密种类详解和使用场景
  • GitLab 版本控制与管理指南
  • Python动态方法调用全解:从字符串到执行的艺术
  • Blender入门学习03
  • 网站建设龙兵科技嘉兴网站建设网站建设
  • html代码下载网站怎么优化关键词
  • Kafka面试精讲 Day 27:监控告警与故障排查
  • C++ ABI:编译报错之:gcc 4.8.1 切 gcc 6.1.0
  • OLED-on-silicon(OLEDoS)技术正成为VR/MR设备显示技术的未来大趋势
  • QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
  • 网站制作全包多少钱演出票务网站建设
  • 用 Go 手搓一个 NTP 服务:从“时间混乱“到“精准同步“的奇幻之旅
  • 如何设计一个高并发系统?
  • 仓颉语言核心技术全解析与实战教程
  • 【多维聚类算法】RQ-Kmeans 利用残差信息 捕捉细节特征
  • 【代码随想录算法训练营——Day44】动态规划——1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列
  • 北住房和城乡建设厅网站亦庄建设局网站
  • 做生鲜食品最好的网站深圳网站建设犀牛云
  • Spring—容器
  • 汉南公司网站建设山东定制版网站建设公司
  • .NET WinForms + WPF 综合学习路线:从传统到现代的.NET桌面开发
  • 怀柔做网站设计师网上接单被骗
  • Go语言实战:入门篇-4:与数据库、redis、消息队列、API
  • Go语言:一文学搞懂核心函数“make”
  • 什么网站是教做纸工的测量为什么要建站