Skip to content

受控组件与非受控组件

受控组件

受控组件是指表单元素由 React 状态管理propsstate),并通过事件处理函数(如 onChange)来更新状态。

jsx
import { useState } from 'react';

const controlledComponent = () => {
  const [name, setName] = useState('');
  const handleChange = (event) => {
    setName(event.target.value);
  }
  return (
    <>
      <input
        type="text" 
        value={name} 
        onChange={handleChange}
      />
      <p>Name: {name}</p>
    </>
  )
}

非受控组件

非受控组件是指表单元素由 DOM 状态管理,并通过 ref 来获取值。

jsx
import { useRef } from 'react';

const uncontrolledComponent = () => {
  const inputRef = useRef(null);
  const handleSubmit = () => {
    console.log(inputRef.current.value);
  }
  return (
    <>
      <input type="text" ref={inputRef} />
      <button onClick={handleSubmit}> submit </button>
    </>
  )
}

受控组件 vs 非受控组件

特性受控组件非受控组件
数据管理由 React 状态管理由 DOM 状态管理
获取数据value属性 + onChange 事件refs 获取
初始值数据通过 state 属性初始化defaultValue/defaultChecked
实时验证✅ 实时同步❌ 提交时才获取
性能可能比较低(频繁渲染)较高
适用场景复杂表单需要实时交互简单表单、文件上传、性能敏感场景