Skip to content

受控组件和非受控组件

在 React 中,表单元素的数据(State)由谁来管理,是区分这两种模式的根本。

  1. 受控组件
  2. 非受控组件

受控组件

在受控组件中,表单元素的值由 React 的 state 完全控制。React state 是表单数据的“唯一数据源”

工作流程:

  1. 组件 state 中存储着表单的当前值。
  2. state 值通过 value prop 转递给表单元素。
  3. 用户交互(例如:输入)触发 onChange 事件。
  4. onChange 事件处理器中更新组件的 state。
  5. state 更新后,React 重新渲染组件,表单元素的值更新为最新的 state。

非受控组件

非受控组件中,表单数据由 DOM 自身管理。React 不再直接控制表单元素的值,而是通过 ref 获取对 DOM 节点的直接引用,在需要的时候(例如:表单提交)“拉取”其当前的值。

工作流程:

  1. 使用 useRef 创建一个引用。
  2. 通过 ref prop 将其附加到一个 DOM 元素上。
  3. 使用 defaultValue 设置初始值,而不是 value
  4. 在需要时通过 ref.current.value 读取值。

受控组件 vs 非受控组件

特性受控组件非受控组件
数据流单向数据流DOM 自身管理 state
值来源React state 是唯一数据源DOM 是数据源,通过 ref 读取
实现方式value + onChange + useStateref + defaultValue
实时交互可轻松实现即时验证、动态 UI需在事件中手动获取值
复杂度需要更多模板代码代码简洁

基于 MIT 许可发布