主题
受控组件与非受控组件
什么是受控组件?
受控组件是指表单元素的值由 React 的 state 控制。用户输入会触发状态更新,从而重新渲染组件,保持数据一致性。
jsx
import { useState } from 'react';
function ControlledInput() {
const [value, setValue] = useState('');
return (
<input
type="text"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
);
}
在这个例子中,input
的值由 value
状态控制,任何用户输入都通过 onChange
修改状态。
什么是非受控组件?
非受控组件使用 ref
直接访问 DOM 元素的值,React 不管理其状态,适用于简单、不需要频繁更新的场景。
jsx
import { useRef } from 'react';
function UncontrolledInput() {
const inputRef = useRef();
const handleClick = () => {
alert(inputRef.current.value);
};
return (
<>
<input type="text" ref={inputRef} />
<button onClick={handleClick}>获取输入值</button>
</>
);
}
在这个例子中,输入框的值不会存储在组件状态中,而是通过 ref
直接读取。
选择哪种方式?
对比项 | 受控组件 | 非受控组件 |
---|---|---|
数据来源 | React state | DOM 本身 |
状态管理 | 明确、集中 | 分散、不可追踪 |
推荐使用场景 | 表单验证、复杂交互 | 简单表单、快速开发 |
可测试性 | 更易测试 | 测试复杂 |
总结
- 受控组件 提供了更强的控制力和一致性,推荐用于大多数表单。
- 非受控组件 更接近原生 HTML 表单行为,适合简单的场景。