如何在 React 中处理多个输入
最近,在处理多个输入时,我不得不重构 React Form,我想分享一下我是如何做到的。
我的表单如下所示:
问题
- 看看下面的启动代码
- 该
Form
组件共有 5 个输入字段;5 种不同的状态和 5 种不同的onChange
内联函数 - 这不完全是 DRY 代码🙀
import React, { useState } from "react";
export default function Form() {
const [newCompany, setCompany] = useState("");
const [newPosition, setPosition] = useState("");
const [newLink, setNewLink] = useState("");
const [newDate, setNewDate] = useState("");
const [newNote, setNewNote] = useState("");
return (
<form>
<input
value={newCompany}
onChange={(e) => setCompany(e.target.value)}
label="Company"
/>
<input
value={newPosition}
onChange={(e) => setPosition(e.target.value)}
label="Job Title"
/>
<input
value={newLink}
onChange={(e) => setNewLink(e.target.value)}
label="Job Link"
/>
<input
type="date"
value={newDate}
onChange={(e) => setNewDate(e.target.value)}
/>
<input
value={newNote}
onChange={(e) => setNewNote(e.target.value)}
label="Note"
/>
<button type="submit"> Submit </button>
</form>
);
}
- 另外,如果我稍后想添加一个
reset
函数,我的代码将如下所示:🙅🏽♀️
const reset = () => {
setCompany("");
setPosition("");
setNewLink("");
setNewDate("");
setNewNote("");
};
解决方案:重构✨
步骤 1:添加输入默认值并初始化状态
- 首先,让我们为所有输入字段添加默认值
- 我们怎么做呢?我们用这些值创建一个对象字面量,并将其设置为空字符串。
- 然后,使用
useState()
React Hook,我们values
用initialValues
对象初始化状态 - 重要提示:请记住将
value
属性及其对应的值添加到每个输入字段(例如values={values.company}
)
const initialValues = {
company: "",
position: "",
link: "",
date: "",
note: "",
};
export default function Form() {
const [values, setValues] = useState(initialValues);
return (
<form>
<input
value={values.company}
onChange={(e) => setCompany(e.target.value)}
label="Company"
/>
//...
步骤 2:处理多个输入变化
- 这里的目标是用一个处理程序来处理所有输入
onChange
- 为了在输入字段每次发生变化时更新并跟踪它们,我们需要创建一个
handleInputChange
函数(见下文) - 这里发生了什么?(快速回顾)
- 首先,我们使用对象解构来从我们的输入中获取或提取
name
和value
属性(查看下面的评论 - 它们是等效的) - 然后,我们使用函数和扩展运算符,
values
用现有值更新状态对象setValues()
- 最后,我们使用以下 ES6 语法来更新
value
由此触发的事件:onChange
[name]: value
- 这一步非常重要
name
!我们需要为输入添加一个属性,[name]: value
这意味着我们要设置一个动态name
属性键(取自我们的输入 -例如company: e.target.value
),该键的值将等于value
我们当前输入状态的 。
- 首先,我们使用对象解构来从我们的输入中获取或提取
参考:React 文档
//...
const handleInputChange = (e) => {
//const name = e.target.name
//const value = e.target.value
const { name, value } = e.target;
setValues({
...values,
[name]: value,
});
};
return (
<form>
<input
value={values.company}
onChange={handleInputChange}
name="company" //IMPORTANT
label="Company"
/>
// ...
步骤 3:添加handleInputChange
到输入字段
- 将函数添加
handleInputChange
到onChange
每个输入字段的 prop中 - 查看最终代码;这是一个更清晰、更易于管理的形式👌🏽
import React, { useState } from "react";
const initialValues = {
company: "",
position: "",
link: "",
date: "",
note: "",
};
export default function Form() {
const [values, setValues] = useState(initialValues);
const handleInputChange = (e) => {
const { name, value } = e.target;
setValues({
...values,
[name]: value,
});
};
return (
<form>
<input
value={values.company}
onChange={handleInputChange}
name="company"
label="Company"
/>
<input
value={values.position}
onChange={handleInputChange}
name="position"
label="Job Title"
/>
// ... Rest of the input fields
<button type="submit"> Submit </button>
</form>
);
}
希望对你有帮助。欢迎大家评论和反馈!🎊
文章来源:https://dev.to/deboragaleano/how-to-handle-multiple-inputs-in-react-55el