Data & react

Table of Contents

You’ll frequently need to pass data between your react components. If you need to pass data from a parent component to a child component, the easy way is to use props. But what if you want to pass data from a child component to its parent component ?…

Passing data from parent to child component

In our scenario, the child component has for only function to display a count value :

function Child({ childCount }) {

  return (
    <div>
      <p>Count: {childCount}</p>
    </div>
  );
}

The parent component set the child’s count by passing it as a prop :

function Parent() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <Child childCount={count} />
      <button onClick={() => setCount((prevCount) => prevCount - 1)}>-</button>
      <button onClick={() => setCount((prevCount) => prevCount + 1)}>+</button>
    </div>
  );
}

Passing data from child to parent component

What if we don’t want to deal with the details of the buttons rendering implementation inside the parent component ? And what if at the same time we want to pass data from the child component to the parent component ? In that case you would have to re-write the child component like this :

function Child({ childCount, plusHandler, minusHandler }) {
  const plus = () => {
    plusHandler(new Date());
  };

  const minus = () => {
    minusHandler(new Date());
  };

  return (
    <div>
      <p>Count: {childCount}</p>
      <button onClick={minus}>-</button>
      <button onClick={plus}>+</button>
    </div>
  );
}

We would then have to rewrite the parent component :

function Parent() {
  const [count, setCount] = useState(0);
  const [plusTime, setPlusTime] = useState(new Date());
  const [minusTime, setMinusTime] = useState(new Date());

  const plus = (t) => {
    setCount((prevCount) => prevCount + 1)
    setPlusTime(t)
  };

  const minus = (t) => {
    setCount((prevCount) => prevCount - 1);
    setMinusTime(t)
  };

  return (
    <div>
      <Child childCount={count} plusHandler={plus} minusHandler={minus} />
      <p>Add button clicked at : {plusTime.toString()}</p>
      <p>Minus button clicked at : {minusTime.toString()}</p>
    </div>
  );
}

As you can see you can pass a lot more than value through props, you can also pass functions. Those functions can be used as callbacks to pass information back from a child component to its parent component. Managing state this way has many advantages, in this example the child component doesn’t need to keep track of times value nor count values.