Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Data is delayed by one while passing from child component to parent

i have two component App and Child .And whenever there’s a change in the input field of the Child component it should update the change in the App component instantly.
But rather than updating the App instantly it is one step behind.
here is the code :-

App component

function App() {
  const [ChildData, setChildData] = useState("");
  
  
  return (
    <div>
      <div>
        <Child passdata={setChldData}/>
      </div>
      <div>
        {ChildData.name}
      </div>
      
    </div>
  )
}

Child component

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

function Child(props) {
    const [Data, setData] = useState({ name:'' ,title:'' ,phone:'' });
  
    const handleChange = (e)=>{
        setData({...Data, [e.target.name] : e.target.value})
        props.passdata(Data)
    }
  
    return (
    <div>
      <h2>Child Data</h2>
      <input type="text" name='name' onChange={handleChange} placeholder={"Name"}/>
      <input type="text" name='title' onChange={handleChange} placeholder={"Title"}/>
      <input type="number" name='phone' onChange={handleChange} placeholder={"Phone number"}/>

    </div>
  )
}

Whenever there;s a change in the input field it is one step behind.
i want the App component change simultaneously with the input from Child

>Solution :

function Child(props) {
    const [Data, setData] = useState({ name:'' ,title:'' ,phone:'' });
  
    const handleChange = (e)=>{
        setData((prevData) => {
            const newData = {...prevData, [e.target.name] : e.target.value}
            props.passData(newData)
            return newData
        })
    }
  
    return (
    <div>
      <h2>Child Data</h2>
      <input type="text" name='name' value={data.name} onChange={handleChange} placeholder={"Name"}/>
      <input type="text" name='title' value={data.title} onChange={handleChange} placeholder={"Title"}/>
      <input type="number" name='phone' value={data.phone} onChange={handleChange} placeholder={"Phone number"}/>

    </div>
  )
}

By the way you also forgot to bind value on the fields so changes in the state from somewhere other than typing in the box wouldn’t have been reflected. I’ve fixed that too.

Additionally what you are doing looks like a code smell. You generally don’t want to duplicate state in two places. Instead, you should have one canonical truth. What is the point in the copy that exists in child if you can just pass it back down from the parent?

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading