I'm trying to create a form where I'm letting user to add as many number of input fields and also giving an ability to remove any particular added input field.
Adding a field works fine, however, the remove always removes the last field, not the one which I wanted to remove.
function App() { const [fields, setFields] = useState([{ value: null }]); function handleChange(i, event) { const values = [...fields]; values[i].value = event.target.value; setFields(values); } function handleAdd() { const values = [...fields]; values.push({ value: null }); setFields(values); } function handleRemove(i) { const values = [...fields]; values.splice(i, 1); setFields(values); } return ( <div className="App"> <h1>Hello CodeSandbox</h1> <button type="button" onClick={() => handleAdd()}> + </button> {fields.map((field, idx) => { return ( <div key={`${field}-${idx}`}> <input type="text" placeholder="Enter text" onChange={e => handleChange(idx, e)} /> <button type="button" onClick={() => handleRemove(idx)}> X </button> </div> ); })} </div> ); }
The code sandbox is here: https://codesandbox.io/s/q555kp8jj?fontsize=14
The same thing works with Class component, here is the code sandbox: https://codesandbox.io/s/wznq443xl?fontsize=14
To reproduce the issue, follow these steps:
- Add some text in the 1st input text field
- Add a new text field by clicking on + button
- Click on X button next to the 1st text field
You can see that the above step removes the 2nd field, not the 1st field.
When I inspect, the fields
state is properly updating when I click remove button. Kindly help.
Update: The issue has been solved after making the input
to controlled component. Thanks to a reddit user to find the issue. Refer more here
Top comments (5)
Solved this issue by making the input as controlled component after a reddit user helped.
Refer here.
It's amazing solution, but when using drop-down instead of input, then having issue. If I have two drop-down, on the base of one selection other drop-down appear and I change value. But if I change again the value of first drop-down, the second drop-down value is not reset in UI. I have around 4 type of second field which appear on the base of first drop-down selection.
I am having same issue. did you get solution for that?
Thank you for sharing this, I've used your sample to built the same form as a WordPress Gutenberg block.
Really helpful and clear, sending some good vibes.
Glad it helped!