Frontend Study

React #7 _ Key의 중요성

jimmmy_jin 2024. 12. 31. 12:26

흔히 map 돌릴때 key가 사용되는데

react에서는 key가 되게 유용하다.

 

key가 값을 식별해서 고정시켜준다? 한 마디로 약간 ID 같은 느낌이다.

예를 들어서 

const [counterChanges, setCounterChanges] = useState([
    {
      value: initialCount,
      id: Math.random() * 1000,
    },
  ]);

 

useState 초기값을 이런식으로 만들어서 value와 id를 부여해주고

아래와 같이 받아서 그 값을 사용할 때

<ol>
      {history.map((count) => (
        <HistoryItem key={count.id} count={count.value} />
      ))}
    </ol>

 

key로 고유 id를 지정해놓으면 새로운 값이 추가되더라도 기존의 값을 계속해서 지목한다.

근데 이 방법이 되게 유용한게 react에서는 map에서만 key가 쓰이는 게 아니고

컴포넌트에도 쓰이는데, 이 전에도 key의 기능을 공부했던 적 있었지만

같은 child에 중복해서 쓰면 안되고, 기타 등등

 

근데 만약에 어떤 값에 변화가 없을때는 리랜더링을 방지하고 변화가 있을 때 

그 컴포넌트를 실행시키는 useEffect가 있는데 뭐 물론 useEffect를 사용해도 결과는 같게 작용한다.

예를 들어서

 useEffect(() => {
    setCounterChanges([{ value: initialCount, id: Math.random() * 1000 }]);
  }, [initialCount]);

  // const [counter, setCounter] = useState(initialCount);
  const [counterChanges, setCounterChanges] = useState([
    {
      value: initialCount,
      id: Math.random() * 1000,
    },
  ]);

 

이런식으로 강제적으로 useEffect를 사용해서 초기값을 변경값으로 바꿔줄 수 있지만 이 방법이 효율적이지 않다는 거다.

그냥 단순하고 간단하게

변화하는 값을 컴포넌트에 key로 넣어주면 해결된다.

<main>
        <ConfigureCounter onSet={handleSetCount} />
        <Counter key={chosenCount} initialCount={chosenCount} />
      </main>

 

Counter에 Key로 변화하는 값, 사용자가 인풋에 넣는 값의 state를 key로 등록하니까 key가 변경할때 해당 컴포넌트가 리랜더링 되는 거라서 간단하고 효율적으로 해결된다.

 

useEffect를 남발하지말고 key를 적절하게 사용하자!