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

React:受控组件和非受控组件

受控组件和非受控组件

      • 受控组件
      • 非受控组件
      • 选择建议

受控和非受控指的都是 state,也就是指受 state 控制、不受 state 控制

受控组件

对于 input 输入框,如果使用 value 属性来接受状态值,并且配置 onChange 事件,那它就是受控组件,也就是受 state 控制,因此,它不能直接编辑(在 input 中就是无法直接更改输入框中的值)

function ControlledInput() {const [value, setValue] = useState('');return <input value={value} onChange={(e) => setValue(e.target.value)} />;
}

受控组件的数据流是双向的。在上面这个例子中,往输入框输入内容,会即时反映到视图上。我们会发现它跟 Vue 中的 v-model 有相似之处

要获取组件的值,直接使用 state 的值就可以了

以下是官方的定义

受控组件是指表单元素的值由 React 组件的状态(state)控制。用户输入时,值会通过事件处理函数更新状态,从而实现双向数据绑定受控组件的值始终与 React 的状态同步,适用于需要对输入进行实时验证或处理的场景。

优点包括数据流清晰、易于验证和动态控制。缺点是代码量较多,尤其是表单复杂时,需要为每个输入字段编写事件处理逻辑。


非受控组件

当我们在 input 标签中使用 defaultValue 属性进行赋值时,那它就是非受控组件。与受控组件相反,非受控组件可以直接编辑组件的值

要获取非受控组件的值,需要通过 ref,也可以通过 getElementsById 来获取

非受控组件的值由 DOM 自身管理,而不是通过 React 状态控制。通常通过 ref 直接访问 DOM 元素的值,适用于简单表单或需要集成第三方库的场景。

<inputtype="text"defaultValue="初始值"ref={(input) => this.input = input}
/>
import React, { Component } from 'react';export class UnControll extends Component {constructor(props) {super(props);this.inputRef = React.createRef();}handleSubmit() {console.log(this.inputRef.current.value);}render() {return (<form onSubmit={(e) => this.handleSubmit(e)}><input defaultValue="123" ref={this.inputRef} /></form>)}
}

优点包括代码简洁、性能较高,适合无需即时反馈的场景。缺点是数据流不够透明,难以实现复杂的交互逻辑。

选择建议

需要实时验证或动态控制表单行为时,优先使用受控组件。
对于简单表单或性能敏感场景,非受控组件更为合适。两者可以结合使用,例如在表单提交时通过 ref 获取非受控组件的值。

http://www.xdnf.cn/news/17135.html

相关文章:

  • 2025年测绘程序设计模拟赛一--地形图图幅编号及图廓点经纬度计算
  • 202506 电子学会青少年等级考试机器人六级实际操作真题
  • 简单介绍cgroups以及在K8s中的应用
  • copy_file_range系统调用及示例
  • CubeFS存储(一)
  • HTML应用指南:利用GET请求获取全国OPPO官方授权体验店门店位置信息
  • css优化、提升性能方法都有哪些?
  • LINUX-磁盘管理
  • 基于2025年《Science》期刊论文的科研图表Python绘制分析
  • 二、Envoy静态配置
  • Linux环境下部署SSM聚合项目
  • 阿里云polardb-x 2.0迁移至华为云taurusdb
  • 安卓雷电模拟器安装frida调试
  • BottomSheetDialogFragment 设置背景为透明无效果(解决方法)
  • antd组件select下拉数据分页加载
  • vcpkg: 一款免费开源的C++包管理器
  • 计算机网络:如何判断B或者C类IP地址是否划分了子网
  • 基于Hadoop的木鸟民宿数据分析与可视化、民宿价格预测模型系统的设计与实现
  • CAN通信
  • 解决Node.js v12在Apple Silicon(M1/M2)上的安装问题
  • 使用R将nc文件转换为asc文件或者tif文件
  • 下载Android studio
  • try catch throw的本质
  • Linux《进程间通信(上)》
  • WARN:get Topic [TBW102] RouteInfoFromNameServer is not exist value
  • 使用MatterJs物理2D引擎实现重力和鼠标交互等功能,有点击事件(盒子堆叠效果)
  • [Oracle] NVL()函数
  • 测试单节点elasticsearch配置存储压缩后的比率
  • 河南萌新联赛2025第(四)场【补题】
  • 8月6日星期三今日早报简报微语报早读