发布于 2024 年 8 月 20 日,星期二
React表单处理的两种核心方式:受控组件和非受控组件。受控组件通过状态管理表单数据,确保数据与UI同步,适合复杂交互和实时验证。非受控组件依赖DOM自身管理数据,简化代码,适用于简单场景。选择合适的控制方式能提升代码效率和用户体验,关键在于平衡状态管理的复杂性与性能需求。深入理解这两种方式的本质,有助于在前端开发中做出更优的技术决策。
在 React 开发中,我们经常需要处理表单输入等用户交互场景。
React 提供了两种不同的组件模式来处理这些交互:受控组件(Controlled Components)和非受控组件(Uncontrolled Components)。
本文将深入探讨这两种组件的概念、数据更新和处理方式、特点、适用场景、测试及优缺点等。
受控组件指表单数据由 React 组件来管理的组件。组件的状态成为了"唯一数据源"。渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。
import React, { useState } from 'react';
function ControlledForm() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const handleNameChange = event => {
setName(event.target.value);
};
const handleEmailChange = event => {
setEmail(event.target.value);
};
const handleSubmit = event => {
event.preventDefault();
console.log('Submitted:', { name, email });
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="name">Name:</label>
<input type="text" id="name" value={name} onChange={handleNameChange} />
</div>
<div>
<label htmlFor="email">Email:</label>
<input type="email" id="email" value={email} onChange={handleEmailChange} />
</div>
<button type="submit">Submit</button>
</form>
);
}
非受控组件是指表单数据由 DOM 节点来处理的组件。React 不会主动管理组件的状态,而是让表单数据存储在 DOM 节点中。
js-dom
等第三库支持import React, { useRef } from 'react';
function UncontrolledForm() {
const nameInput = useRef(null);
const emailInput = useRef(null);
const handleSubmit = event => {
event.preventDefault();
const name = nameInput.current.value;
const email = emailInput.current.value;
console.log('Submitted:', { name, email });
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="name">Name:</label>
<input type="text" id="name" ref={nameInput} />
</div>
<div>
<label htmlFor="email">Email:</label>
<input type="email" id="email" ref={emailInput} />
</div>
<button type="submit">Submit</button>
</form>
);
}
受控组件和非受控组件各有优缺点,选择使用哪种方式取决于具体的应用场景和需求。
受控组件提供了更强的数据控制能力和即时反馈,适合复杂的表单场景;
非受控组件实现简单,性能较好,适合简单的表单和特殊场景
无论选择哪种方式,都要注意保持数据的一致性和完整性,确保用户输入的数据能够被正确地收集、验证和提交。同时,也要关注表单的可访问性和用户体验,为用户提供友好、便捷的表单交互方式。
上次我开发了一个工具,解决了手动挨个删除清理无用的仓库问题。如果你感兴趣,可以去看看哦!😊
如果你觉得这个工具对你有所帮助,请不要忘记给我的 GitHub 仓库 点个 Star ⭐!你的支持是我前进的动力!
介绍文章https://mp.weixin.qq.com/s/t7lgc6b7xJiNhfm5vWo5-A: https://mp.weixin.qq.com/s/t7lgc6b7xJiNhfm5vWo5-Ahttps://mp.weixin.qq.com/s/t7lgc6b7xJiNhfm5vWo5-A
GitHub 仓库地址https://github.com/yaolifeng0629/del-repos: https://github.com/yaolifehttps://github.com/yaolife ng0629/del-repos
感谢阅读,我们下次再见!