0

How to update 2 interdependent input fields in react correctly? This code updates one input based on other but fails to update itself in the process.

    import { useState } from "react";

export default function App() {
  const [data1, setData1] = useState(0);
  const [data2, setData2] = useState(0);

  const inputEvent1 = (e) => {
    //e.preventDefault();
    const data2 = (e.target.value / 2).toString();
    setData2(data2);
    console.log("inputEvent1 " + e.target.value);
  };

  const inputEvent2 = (e) => {
    //e.preventDefault();
    const data1 = (e.target.value * 2).toString();
    setData1(data1);
    console.log("inputEvent2 " + e.target.value);
  };

  return (
    <form className="a">
      <div className="b">
        <h1 className="c">Data Changer</h1>
        <div className="">
          <div className="d" onChange={inputEvent1}>
            <p>Enter Data1:</p>
            <input
              name="dataField1"
              type="text"
              className="input"
              placeholder="Data1"
              value={data1.toString()}
            />
          </div>
          <div className="e" onChange={inputEvent2}>
            <p>Enter Data2:</p>
            <input
              name="dataField2"
              type="text"
              className="input"
              placeholder="Data2"
              value={data2.toString()}
            />
          </div>
        </div>
      </div>
    </form>
  );
}

CodeSandbox https://codesandbox.io/s/react-data-changer-2-input-boxes-q3pt9?file=/src/App.js:0-1298

1 Answer 1

1

you just need another setState in your eventHandlers to set the changing field like this:

  const inputEvent1 = (e) => {
    const data2 = (e.target.value / 2).toString();
    setData1(e.target.value);
    setData2(data2);
  };

  const inputEvent2 = (e) => {
    const data1 = (e.target.value * 2).toString();
    setData2(e.target.value);
    setData1(data1);
  };

here is the working sandbox

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.