javascript - 单击以从 React JS 中的字段添加新输入时如何将“添加”按钮固定在顶部
问题描述
我在 React 中有一个组件,当单击“添加”按钮时,会创建新的表单字段。但是,当我单击添加按钮时,新表单字段将添加到添加按钮的顶部而不是其下方。
我需要将添加按钮固定在顶部,并创建新的表单字段以堆叠在其他现有表单字段的顶部。我想知道我需要对我的代码进行哪些更改才能实现这一目标。
function DynamicFormFields() {
const [inputList, setInputList] = useState([{ name: "", quantity: "" }]);
// handle input change
const handleInputChange = (e, index) => {
const { name, value } = e.target;
const list = [...inputList];
list[index][name] = value;
setInputList(list);
};
// handle click event of the Remove button
const handleRemoveClick = (index) => {
const list = [...inputList];
list.splice(index, 1);
setInputList(list);
};
// handle click event of the Add button
const handleAddClick = () => {
setInputList([{ name: "", quantity: "" }, ...inputList]);
};
return (
<>
<div className="DynamicFormFields">
<h3>
<p>Dynamic Form</p>
</h3>
{inputList.map((x, i) => {
// x -> element, i -> index
return (
<div className="box">
<div className="btn-box">
{inputList.length - 1 === i && (
<button onClick={handleAddClick}>Add</button>
)}
</div>
<input
name="name"
placeholder="Name"
value={x.name}
onChange={(e) => handleInputChange(e, i)}
/>
<input
type="number"
name="quantity"
// className="ml10"
min="1"
max="12"
></input>
{inputList.length !== 1 && (
<button className="mr10" onClick={() => handleRemoveClick(i)}>
Remove
</button>
)}
</div>
);
})}
</div>
</>
);
}
解决方案
好的,我不确定我是否完全理解您想要的内容,但我很快就做了一些更改(可能包含错误)。这是你想要做的吗?另外我建议将您的输入项制作成小的子组件,这可以帮助您更清楚地看到整体情况。
function DynamicFormFields() {
const [inputList, setInputList] = useState([{ name: "", quantity: "" }]);
// handle input change
const handleInputChange = (e, index) => {
const { name, value } = e.target;
const list = [...inputList];
list[index][name] = value;
setInputList(list);
};
// handle click event of the Remove button
const handleRemoveClick = (index) => {
const list = [...inputList];
list.splice(index, 1);
setInputList(list);
};
// handle click event of the Add button
const handleAddClick = () => {
setInputList([{ name: "", quantity: "" }, ...inputList]);
};
return (
<>
<div className="DynamicFormFields">
<h3>
<p>Dynamic Form</p>
</h3>
<div className="box">
<div className="btn-box">
<button onClick={handleAddClick}>Add</button>
</div>
<div>
{inputList.map((x, i) => {
// x -> element, i -> index
return (
<div>
<input
name="name"
placeholder="Name"
value={x.name}
onChange={(e) => handleInputChange(e, i)}
/>
<input
type="number"
name="quantity"
// className="ml10"
min="1"
max="12"
></input>
{inputList.length !== 1 && (
<button
className="mr10"
onClick={() => handleRemoveClick(i)}
>
Remove
</button>
)}
</div>
);
})}
</div>
</div>
</div>
</>
);
}
这里的主要变化是我将按钮放在循环之外,因为据我所知,它不应该依赖于您的其他输入项。我还将您的输入包装在另一个 div 中,以完全分离按钮和输入。确保只更新需要更新的内容,以免出现意外行为。
推荐阅读
- contentful - Contentful Management API 上传图片
- javascript - 使用 parseInt 函数需要指南
- raspberry-pi3 - 当我在 RaspBerry pi 中安装 Bazel 时出错
- android - 如何更改 listView 的一项的颜色背景
- javascript - React Leaflet:FlyToBounds 以编程方式更改道具
- angular - Firebase 以某种方式部署旧版本(角度 6)
- android - FileNotFoundException:/storage/sdcard0/Myfile.txt:打开失败:EACCES(权限被拒绝)
- css - 尝试将位置固定添加到导航
- java - 在 intellij 中构建失败
- c - 仅使用 gl.h 和 glu.h 编程 OpenGL