React 实践约 5 分钟

受控与非受控:表单状态该放在哪里

一个输入框的 value 由谁控制,决定了校验、重置和提交的写法。这篇笔记对比两种方式,并给出一个简单的选择标准。

屏幕上展示 React 表单组件与输入状态处理代码
本文目录

受控组件把输入框的值交给 React state 管理,非受控组件让 DOM 自己保存值,需要时通过 ref 读取。两者没有优劣,只有适用场景的差别。

受控与非受控的区别

TSX
const [keyword, setKeyword] = useState("");

<input
  value={keyword}
  onChange={(event) => setKeyword(event.target.value)}
  placeholder="搜索笔记"
/>;

const inputRef = useRef<HTMLInputElement>(null);
<input ref={inputRef} defaultValue="" />;

受控写法每次输入都会触发渲染,换来的是值随时可读、可校验、可联动;非受控写法渲染更少,取值时机集中在提交那一刻。

表单状态放在组件里还是页面里

状态应该放在需要读取它的最近公共父级。只有提交时才用一次的值,可以留在表单组件内部;需要和列表筛选、地址栏参数联动的值,就应该提到页面层。

一个判断标准

如果这个值会影响其他 UI 的显示,用受控;如果它只在提交时被读取一次,用非受控。不要在两种方式之间反复切换,固定一种写法能让表单代码更好读。

状态的位置比状态的数量更影响可维护性。

相关阅读