I am trying to build a flexible list with an input field so that whenever I write something in that input field it changes the value.
But, in whichever input field I type it changes the only name of first field alone.
Like there are 3 input field and 3 paragraph tag according to state. I want to update the input field’s above p tag (displaying the name) onChange of input field.
I am trying to implement this function using React hooks.
Here is my code:
App.js
const initialPersonState = [ {name:"Vivank",age:"21"}, {name:"Shubham",age:"18"}, {name:"Max",age:"16"}, ] const [personState, setPersonState] = useState(initialPersonState) const inputChangeHandeler = (event,id) => { const personIndex = personState.findIndex(p =>{ return p.id === id }) const person = { ...personState[personIndex] } person.name = event.target.value const persons = [...personState] persons[personIndex] = person setPersonState(persons) } person = ( <> {personState.map((person,index)=>{ return <Person name={person.name} age={person.age} delete={() => deletePerson(index)} key={person.id} change={(event)=>inputChangeHandeler(event,person.id)} /> }) } </>
Person.js
const person = (props) => { return( <div> <p onClick={()=>props.click("Max!")}>Hello my name is {props.name} and I'm {props.age} years old</p> <p>{props.children}</p> <p onClick={props.delete}>Delete person</p> <input type="text" onChange={props.change}></input> </div> ); }
Advertisement
Answer
You need to pass the value of name
to the input. So your person
component should look like this:
const person = (props) => { return( <div> <p onClick={()=>props.click("Max!")}>Hello my name is {props.name} and I'm {props.age} years old</p> <p>{props.children}</p> <p onClick={props.delete}>Delete person</p> <input type="text" value={props.name} onChange={props.change}></input> </div> ); }
Also, you haven’t defined id
inside person info objects, initial state should look like
const initialPersonState = [ {id: 1, name:"Vivank",age:"21"}, {id: 2, name:"Shubham",age:"18"}, {id: 3, name:"Max",age:"16"}, ];