在 React 中,受控组件和非受控组件是两种处理表单元素(如输入框、选择框等)值的方式。
1. 受控组件
受控组件是指 React 组件的表单元素的值是由 React 组件的 state 来管理的。换句话说,React 会全程控制表单元素的值,每当输入框的内容发生变化时,都会触发事件(如 onChange),并更新组件的 state,从而使组件重新渲染。
特点:
- 表单的值由 React 的 state 控制。
- 必须通过 state 和 setState 来读取和修改表单元素的值。
- 更容易实现表单验证和其他交互逻辑。
示例:
js
import React, { useState } from 'react';
function ControlledInput() {
const [value, setValue] = useState('');
const handleChange = (e) => {
setValue(e.target.value); // 更新 state
};
return (
<input
type="text"
value={value} // 由 state 控制值
onChange={handleChange} // 更新 state
/>
);
}
2. 非受控组件(Uncontrolled Component)
非受控组件是指表单元素的值不受 React state 的控制,而是通过 DOM 元素的本地状态来处理。这意味着 React 不会直接管理表单元素的值,值的管理交由 DOM 本身来控制。
特点:
- 表单的值由 DOM 控制,而非 React state。
- 可以通过 ref 获取当前表单元素的值,而不需要设置 value 和 onChange 处理事件。
- 更接近传统的 HTML 表单操作方式,适合简单场景。
示例:
js
import React, { useRef } from 'react';
function UncontrolledInput() {
const inputRef = useRef(null);
const handleSubmit = (e) => {
e.preventDefault();
alert('输入的值是: ' + inputRef.current.value); // 使用 ref 获取值
};
return (
<form onSubmit={handleSubmit}>
<input type="text" ref={inputRef} /> {/* 不需要 value 和 onChange */}
<button type="submit">提交</button>
</form>
);
}
总结:
- 受控组件适用于复杂的交互场景(如表单验证、动态表单等),可以让 React 完全控制表单的行为。
- 非受控组件适用于简单场景,尤其是当表单不需要频繁的与 React 的 state 交互时。