我有一个form
,其中有一个初始空白input
字段,我想使用一个Add
按钮进行克隆,并使用一个Remove
进行删除。
由于不建议对具有动态格式的键使用索引,因此我尝试使用uniqid
模块。但是每次state
更新时,键都会更新,并且我没有唯一的数据来标识表单的每个输入。我可以添加一些项目,但不能删除。
input
字段没有唯一值,没有id
,我该怎么办?
const Form = () => {
const update = e => {};
const items = [{ content: "", color: "" }];
return (
<Fragment>
{items.map((item, idx) => (
<input
htmlFor={`item_${idx}`}
value={item.content}
onChange={update("item", idx)}
/>
))}
<button onClick={e => dispatch(add(idx))}>Add</button>
<button onClick={e => dispatch(remove(idx))}>Remove</button>
</Fragment>
);
答案 0 :(得分:1)
您可以简单地将现有的items
扩展为具有唯一的id
属性-最简单的是,您可以为该属性分配最大使用量id
的值加1-猜猜,它可以解决大多数实际用例:
const [inputs, setInputs] = useState([{id:0,value:''}]),
onRowAdd = () => {
const maxId = Math.max(...inputs.map(({id}) => id))
setInputs([...inputs, {id:maxId+1, value:''}])
}
有了它,您将拥有唯一的id
来锚定到删除行:
onRowRemove = idToDelete => setInputs(inputs.filter(({id}) => id != idToDelete))
以下是此概念的演示:
const { useState } = React,
{ render } = ReactDOM
const Form = () => {
const [inputs, setInputs] = useState([{id:0,value:''}]),
onInput = (id,value) => {
const inputsCopy = [...inputs],
itemToModify = inputsCopy.find(item => item.id == id)
itemToModify.value = value
setInputs(inputsCopy)
},
onRowAdd = () => {
const maxId = Math.max(...inputs.map(({id}) => id))
setInputs([...inputs, {id:maxId+1, value:''}])
},
onRowRemove = idToDelete => setInputs(inputs.filter(({id}) => id != idToDelete)),
onFormSubmit = e => (e.preventDefault(), console.log(inputs))
return (
<form onSubmit={onFormSubmit} >
{
inputs.map(({id,value}) => (
<div key={id}>
<input
onKeyUp={({target:{value}}) => onInput(id,value)}
/>
<input type="button" onClick={onRowAdd} value="Add" />
<input type="button" onClick={() => onRowRemove(id)} value="Remove" />
</div>
))
}
<input type="submit" value="Log Form Data" />
</form>
)
}
render (
<Form />,
document.getElementById('root')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script><div id="root"></div>
答案 1 :(得分:-1)
您应该创建一个从0开始并在每次添加按钮时加1的变量。这样,您将跟踪所有人。这是一个例子
let i = 0
const add () => {
//your function to add
i++
//remember i will be the id now
}