javascript - 如何在功能组件中像在类组件中一样制作onChange跟踪功能
问题描述
这是我的类组件
handleChange =(e) => {
this.setState({
[e.target.id]: e.target.value
})
}
<div className="input-field">
<label htmlFor="email">Email</label>
<input type="email" id="email" onChange={this.handleChange}/>
</div>
<div className="input-field">
<label htmlFor="password">Password</label>
<input type="password" id="password" onChange={this.handleChange}/>
</div>
如您所见,我们可以使用一个功能组件跟踪所有输入。
但是如何获得与功能组件内部相同的结果呢?现在我正在为每个元素设置状态。
<div className="input-field">
<label htmlFor="email">Email</label>
<input type="email" id="email" onChange={e =>setEmail(e.target.value)}/>
</div>
<div className="input-field">
<label htmlFor="password">Password</label>
<input type="password" id="password" onChange={e => setPassword(e.target.value)}/>
</div>
解决方案
更新类似。data
例如,给定某种状态,处理程序可能如下所示:
const handleChange = (e) => {
const { id, value } = e.target;
setData((data) => ({
...data,
[id]: value
}));
};
使用功能状态更新来传播现有状态,并使用输入的 id 和onChange
事件中的值来更新该部分状态。
完整代码示例
function App() {
const [data, setData] = useState({});
const handleChange = (e) => {
const { id, value } = e.target;
setData((data) => ({
...data,
[id]: value
}));
};
return (
<div className="App">
<div className="input-field">
<label htmlFor="email">Email</label>
<input type="email" id="email" onChange={handleChange} />
</div>
<div className="input-field">
<label htmlFor="password">Password</label>
<input type="password" id="password" onChange={handleChange} />
</div>
<div>Email: {data.email}</div>
<div>Password: {data.password}</div>
</div>
);
}
推荐阅读
- html - 在 CSS 中动态格式化样式
- sql - 使用数据样式 NULL 转换为 int
- memory-management - 在 Linux、windows 和 OX 中绕过内存管理系统
- java - 在 CodeDeploy 中访问 CodeBuild 运行时
- python - 有没有办法将会话从 python 传输到浏览器?
- javascript - 获取错误在控制台中提供了比在 catch 方法中更多的错误信息
- javascript - 使用钩子(setState,useEffect)从屏幕中提取重复代码的最佳方法?
- scala - 通过 slick codegen 导入从另一个项目构建的依赖项时,“对象不是包的成员”
- python - 如何在 pytest 会话结束时清理资源?
- sql - 为什么我的 WHERE 子句会影响我的 LEFT JOIN?