useEffect
화면에 컴포넌트가 렌더링(마운트)/리렌더링 되거나 수정,제거 등의 변경 전(언마운트)에 효과를 주기위해 사용.
마운트 시점에 콘솔로 확인
마운트시점이란 컴포넌트요소가 화면에 렌더링될 때를 말합니다. 구체적으로 말하면 페이지를 맨처음 로딩할 때, 또 어떤 값을 수정/제거하여 변경된 내용이 다시 로딩될 때입니다. 이러한 상황은 props로 받은 값을 useState로 설정(관리)하거나 외부 Api요청시, setInterval, setTimeout설정, url체크하여 렌더링할 요소를 설정할 때 등이 있습니다.
ArrayList.js에서 useEffect를 사용하기위해 먼저 import를 해줍니다. 그리고 아래와 같이 화면출력코드가 있는 TempInfo()항목에 useEffect로 실행될 코드를 선언해줍니다. 렌더링되는 시점에 "렌더링" 텍스트와 tempInfo내용이 출력되도록 해보겠습니다.
import React, { useEffect } from 'react';
function TempInfo({ tempInfo, onRemove, onToggle }) {
useEffect(() => {
console.log("렌더링", tempInfo);
}, [tempInfo]);
return (
<div>
<b style={{
color: tempInfo.active ? 'orange' : 'black',
cursor: 'pointer'
}} onClick={() => onToggle(tempInfo.id)}>
{tempInfo.username}</b> {tempInfo.email}
<button onClick={() => onRemove(tempInfo.id)}>삭제</button>
</div>
)
}
function RenderTempInfoArray({ tempInfoArray, onRemove, onToggle }) {
return (
<>
{
tempInfoArray.map(
tempInfo => (<TempInfo tempInfo={tempInfo} key={tempInfo.id} onRemove={onRemove} onToggle={onToggle} />)
)
}
</>
)
}
export default RenderTempInfoArray;
처음 로딩화면 -
Anne2리스트를 클릭하여 수정한 내용이 렌더링될 때
Anne4를 추가등록한 후 변경내용이 렌더링될 때
주의할 점은 배열로 [tempInfo]를 넣은 부분인데요, 디펜던시(deps)라고 부르는 useEffect관리대상(값 또는 function도 포함)을 넣어주지 않으면 이부분의 코드를 변경된 특정 값에 대해만 실행하는게 아니라 추가/수정시 tempInfo를 포함하는 tempInfoArray의 모든 리스트 수만큼, 또 useState로 관리되는 input의 onChange의 모든 상황마다 매번 계속해서 실행하게 됩니다. 불필요하게 코드가 계속 실행되는 거죠.
useEffect(() => {
코드부분
}, [tempInfo]);
그리고 만약 디펜던시(deps)영역을 빈 배열형태로 넣으면 로딩 후 변경된 값이 체크안되서 이전의 값을 참고하게 될 수 있으므로 관리대상값은 꼭 deps배열안에 추가를 해주어야 합니다.
언마운트 시점에 콘솔로 확인
언마운트상황은 수정/제거등의 변경진행 전 시점에 효과를 주기위해 사용됩니다. 라이브러리 인스턴스를 제거하던가 setInterval/setTimeout해뒀던 요소를 변경하기위해 clearInterval/clearTimeout하는 상황들을 예로 들 수 있습니다.
ArrayList.js에서 추가해줬던 useEffect선언부분에 return부분을 추가해줍니다.
useEffect(() => {
console.log("렌더링", tempInfo);
return () => {
console.log("리렌더링 전", tempInfo);
}
}, [tempInfo]);
Anne1을 클릭하여 수정시 렌더링전(언마운트)의 active: true값이 출력되고 바로 수정된 false값이 출력(마운트)됩니다.
Anne3을 삭제하기 전 상태값을 출력합니다. 삭제된 리스트항목은 출력할 수 없으므로 렌더링text는 출력되지 않습니다.
'React.js > React 입문 - Just 따라하기' 카테고리의 다른 글
배열(Array) 항목 수정 (0) | 2020.06.21 |
---|---|
배열(Array) 항목 제거 (0) | 2020.06.21 |
배열(Array)에 항목 추가 (0) | 2020.06.21 |
배열(Array)정보를 화면에 Rendering (0) | 2020.06.20 |
useRef로 DOM선택 (0) | 2020.06.20 |