从受控输入创建对象数组
Create an array of objects from controlled inputs
我有一个带有动态创建输入的表单。输入的数量及其名称会根据获取的数据而变化。我想根据从这些输入中获得的值创建一个对象数组。
const [form, setForm] = useState([]);
packages = ["250g", "500g"] //This varies depending on fetched data
HTML:
<form onSubmit={(e) => handleSubmit(e)}>
<ul>
{packages.map((packageName, index) => {
return (
<li key={index}>
<p>{packageName}</p>
<input type="number" min={0} value={form[packageName]} onChange={(e) => handleChange(e, packageName)} />
<button type="submit">BUY</button>
</li>
);
})}
</ul>
</form>
handleChange 函数:
const handleChange = (e, packageName) => {
setForm([...form, { [packageName]: parseInt(e.target.value) }]);
};
当前输出:
form: [
{
"250g": 1
},
{
"250g": 2
},
{
"250g": 3
},
{
"500g": 1
},
{
"500g": 2
}
]
输入值的每次更改都会创建一个新对象,但我只想更改当前已更改的特定对象中的值。
期望的输出:
form: {
"250g": { quantity: 3 },
"500g": { quantity: 2 }
}
您可以使用对象而不是数组。
const [form, setForm] = useState({});
const handleChange = (e, packageName) => {
setForm({
...form,
[packageName]: { quantity: parseInt(e.target.value) }
});
}
我正在粘贴 vanilla js 示例可执行文件。
let form = {}
function add(str) {
if (form[str]) {
form[str].quantity += 1
} else {
form[str] = { quantity: 1}
}
}
add("250g")
add("250g")
add("250g")
add("750g")
add("500g")
add("750g")
console.log(form)
所以我猜你的方法会变成这样
const handleChange = (e, packageName) => {
let newForm = JSON.parse(JSON.stringify(form))
if (newForm[packageName]) {
newForm[packageName].quantity += parseInt(e.target.value)
setForm(newForm);
} else {
setForm({
...form,
[packageName]: { quantity: parseInt(e.target.value) }
}
}
我有一个带有动态创建输入的表单。输入的数量及其名称会根据获取的数据而变化。我想根据从这些输入中获得的值创建一个对象数组。
const [form, setForm] = useState([]);
packages = ["250g", "500g"] //This varies depending on fetched data
HTML:
<form onSubmit={(e) => handleSubmit(e)}>
<ul>
{packages.map((packageName, index) => {
return (
<li key={index}>
<p>{packageName}</p>
<input type="number" min={0} value={form[packageName]} onChange={(e) => handleChange(e, packageName)} />
<button type="submit">BUY</button>
</li>
);
})}
</ul>
</form>
handleChange 函数:
const handleChange = (e, packageName) => {
setForm([...form, { [packageName]: parseInt(e.target.value) }]);
};
当前输出:
form: [
{
"250g": 1
},
{
"250g": 2
},
{
"250g": 3
},
{
"500g": 1
},
{
"500g": 2
}
]
输入值的每次更改都会创建一个新对象,但我只想更改当前已更改的特定对象中的值。
期望的输出:
form: {
"250g": { quantity: 3 },
"500g": { quantity: 2 }
}
您可以使用对象而不是数组。
const [form, setForm] = useState({});
const handleChange = (e, packageName) => {
setForm({
...form,
[packageName]: { quantity: parseInt(e.target.value) }
});
}
我正在粘贴 vanilla js 示例可执行文件。
let form = {}
function add(str) {
if (form[str]) {
form[str].quantity += 1
} else {
form[str] = { quantity: 1}
}
}
add("250g")
add("250g")
add("250g")
add("750g")
add("500g")
add("750g")
console.log(form)
所以我猜你的方法会变成这样
const handleChange = (e, packageName) => {
let newForm = JSON.parse(JSON.stringify(form))
if (newForm[packageName]) {
newForm[packageName].quantity += parseInt(e.target.value)
setForm(newForm);
} else {
setForm({
...form,
[packageName]: { quantity: parseInt(e.target.value) }
}
}