1. 순수성: 수식으로서의 컴포넌트
2. 사이드 이펙트: 의도하지 (않은) 결과
3. 사이드 이펙트를 일으킬 수 있는 곳
// 예시
let guest = 0;
function Cup() {
// Bad: changing a preexisting variable!
// 나쁨: 기존 변수를 변경합니다!
guest = guest + 1;
return <h2>Tea cup for guest #{guest}</h2>;
}
export default function TeaSet() {
return (
<>
<Cup />
<Cup />
<Cup />
</>
);
}
guest
변수를 읽고 쓰고 있다.guest
를 읽으면 렌더링된 시점에 따라 JSX도 다르게 생성되므로 예측할 수 없는 일이다.guest
를 prop으로 전달함으로써 이 컴포넌트를 고칠 수 있다.function Cup({ guest }) {
return <h2>Tea cup for guest #{guest}</h2>;
}
export default function TeaSet() {
return (
<>
<Cup guest={1} />
<Cup guest={2} />
<Cup guest={3} />
</>
);
}
guest
prop에만 의존하므로 순수하다.2-1. 지역 변이(Local mutation): 컴포넌트의 작은 비밀
[]
배열을 생성하고 이를 cups
변수에 할당한 다음 컵 12개를 그 안에 push
한다.function Cup({ guest }) {
return <h2>Tea cup for guest #{guest}</h2>;
}
export default function TeaGathering() {
let cups = [];
for (let i = 1; i <= 12; i++) {
cups.push(<Cup key={i} guest={i} />);
}
return cups;
}
cups
변수나 []
배열이 TeaGathering
함수 외부에서 생성되었다면 이는 문제가 될 것이다.TeaGathering
내부에서 동일한 렌더링 중에 생성했기 때문에 괜찮다.TeaGathering
외부의 어떤 코드도 이런 일이 일어났다는 것을 알 수 없다.함수형 프로그래밍은 순수성에 크게 의존하지만, 언젠가는 어딘가에서 무언가는 바뀌어야 한다.
화면 업데이트, 애니메이션 시작, 데이터 변경과 같은 이러한 변경을 사이드 이펙트라고 하며, 렌더링 중에 일어나는 것이 아니라 “부수적으로” 일어나는 일입니다.
React에서 사이드 이펙트는 보통 이벤트 핸들러에 속한다.
이벤트 핸들러는 사용자가 어떤 동작을 수행할 때(예를 들어, 버튼을 클릭할 때) React가 실행하는 함수이다.
이벤트 핸들러가 컴포넌트 내부에 정의되어 있긴 하지만 렌더링 중에는 실행되지 않는다.
따라서 이벤트 핸들러는 순수할 필요가 없다.
다른 모든 옵션을 다 사용했는데도 사이드 이펙트에 적합한 이벤트 핸들러를 찾을 수 없다면, 컴포넌트에서 useEffect 호출을 통해 반환된 JSX에 이벤트 핸들러를 첨부할 수 있다.
이렇게 하면 나중에 렌더링 후 사이드 이펙트가 허용될 때 React가 이를 실행하도록 지시한다.
하지만 이 방법은 최후의 수단으로 사용해야 한다.
https://developer.mozilla.org/ko/