【发布时间】:2021-03-12 11:36:59
【问题描述】:
我正在尝试为用户创建一个表单以提交食谱。我需要将其设置为用户可以单击“+”按钮以添加更多成分或添加更多说明的位置。每个输入旁边还有一个“-”按钮可以将其删除。
我大部分时间都在工作,我可以添加项目。但是,删除项目似乎没有任何一致性。
我正在使用 Material UI,我不确定这是否相关。
这是我正在处理的相关代码,我将在最后链接一个完整的代码框。
const [ingredients, setIngredients] = React.useState(
[
{
name: "",
amount: ""
}
]
);
这是我在 react 中渲染数组的方式
{ingredients.map((ing, idx) => {
return (
<div key={idx}>
<TextField
id={"ing-name-" + idx}
name={"ing-name-" + idx}
variant="outlined"
label="Ingrediant Name"
value={ing.name}
required
onChange={handleIngredientChange}
/>
<TextField
id={"ing-amt-" + idx}
name={"ing-amt-" + idx}
variant="outlined"
label="Ingredient Amount"
value={ing.amount}
required
onChange={handleIngredientChange}
/>
<Button
id={"ing-remove-" + idx}
variant="contained"
color="secondary"
type="button"
onClick={handleIngredientRemove}
>-</Button>
</div>
)
})}
<Button
variant="contained"
color="primary"
type="button"
onClick={handleIngredientAdd}
>+</Button>
最后是处理项目添加/删除的两个函数
function handleIngredientRemove(event) {
/*
* To remove an element, we just use the array.filter function to genereate a new array without the
* element being deleted
*/
console.log(event.target.id);
let idx = parseInt(event.target.id.split("-")[2]);
console.log("Removing ingredient " + idx);
let newIngredients = ingredients.filter((ingredient, index) => idx !== index);
setIngredients(newIngredients);
}
function handleIngredientAdd(event) {
/*
* Same concept as the above methods, concat returns a new array. In this case we get a new array with an
* element containing an empty string in both fields at the end of it
*/
let newIngredients = ingredients.concat({name: "", amount: ""});
setIngredients(newIngredients);
}
【问题讨论】:
标签: javascript reactjs