useEffect의 부작용

  1. useEffect간의 연쇄 작용
  2. 흐름 추적의 어려움
  3. React 18에 strict mode에서 마운트 시점에 useEffect를 두 번 실행시키는 문제가 있다.

<aside> ⚠️ useEffect를 남용하면 side Effect가 걷잡을 수 없이 커져서 유지보수가 어렵거나 새로운 기능을 추가할 때 버그가 발생할 확률도 높아지게 되므로 최소한으로 써야한다.

</aside>

1. props, state 변경에 따라 또 다른 state를 업데이트해야 할 때

import { useState } from 'react';

interface ChildProps {
  num: number;
}

const addFunc = (num: number) => num + 1;

const Child: React.FC<ChildProps> = ({ num }) => {
  const value = addFunc(num);
  return <div>{value}</div>;
};

const App = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <Child num={count} />
      <button onClick={() => setCount((count) => count + 1)}>Click me!</button>
    </div>
  );
};

export default App;

2. props 변경에 따라 특정 상태만 업데이트 해야 하는 경우

import { useState } from 'react';

interface ChildProps {
  num: number;
}

const Child: React.FC<ChildProps> = ({ num }) => {
  const [extra] = useState('ㅋㅋㅋ');
  const [bonusNum, setBonusNum] = useState(0);
  const [prevNum, setPrevNum] = useState(num);

  if (num !== prevNum) {
    setPrevNum(num);
    setBonusNum(num);
  }

  return (
    <div>
      <div>num: {bonusNum}</div>
      <div>{extra}</div>
    </div>
  );
};

const App = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <Child num={count} />
      <button onClick={() => setCount((count) => count + 1)}>Click me!</button>
    </div>
  );
};

export default App;

3. useEffect vs eventHandler