
사람에 빗대어서 표현하는 컴포넌트 주기 (컴포넌트 장착되거나 업데이트되거나 제거되거나)
mount : 컴포넌트(페이지 내용)가 보이는 순간을 마운트된다 또는 페이지에 장착이 된다라고 표현한다
= 로드될때
update : 컴포넌트 안에서 state가 조작을 하게 되면 업데이트 된다
= 재렌더링될때
unmount : 컴포넌트가 쓸모가 없어진다(다시 Home으로 돌아가거나 하면 전에 있던 페이지는 현재 쓸모가 없다) 그러면 제거된다
Lifecycle에 중간중간 간섭을 할 수 있기 때문에 = 즉, 중간중간 코드실행이 가능하다
예) 컴포넌트가 장착이 될때, 업데이트가 될때, 삭제가 될때 특정코드를 실행시킬 수 있다
Lifecycle 각 단계에 갈고리를 달아서 코드를 걸어서 간섭을 할 수 있다
갈고리는 Lifecycle 중간중간 아무곳에나 걸 수 있다
예) mount 단계에 갈고리를 걸으면 갈고리에 걸린 코드를 같이 실행해준다
class Detail extends React.Component{
// 클래스를 하나 생성해서 만든다
// 갈고리를 걸고 싶을 때 만드는 방법
// 기본 함수들
componentDidMount(){ // 컴포넌트 mount시 이 안의 코드가 실행됨
}
componentDidUpdate(){ // 컴포넌트 update시 이 안의 코드가 실행됨
}
componentWillUnmount(){ // 컴포넌트 unmount시 이 안의 코드가 실행됨
}
}
<Detail></Detail>
// hook을 이용한 방식을 사용한다. hook이 갈고리라고 생각하면 편하다
function Detail(){
useEffect(()=>{
// mount(페이지로드), update(재렌더링)시 이 안의 코드가 실행이 된다
console.log('안녕')
// Detail 컴포넌트가 있는 페이지를 로드하면 console창에 안녕이라고 출력된다
})
// update시 안녕이 출력되는 것을 확인하기 위한 코드들 (재렌더링시)
let [count, setCount] = useState(0);
return(
{count}
<button onClick={()=>{setCount(count+1)}}>버튼</button>
)
}
위의 예제에서 console.log('안녕')을 하게 되면 콘솔창에 2번 출력이 되게 되는데 그 이유가 무엇일까?
- 디버깅을 위해서 2번 동작하게 되는데 그 이유는 index.js에서 <React.StrictMode>라는 태그로 인해 발생한다.
1. 복잡한 연산 코드가 들어있을때
2. 서버에서 데이터를 가져오는 작업을 할 때
3. 타이머를 장착하는 작업을 할 때
setTimeout(()=>{실행할 코드},1000)
2초 뒤에 박스를 사라지게 만드는 방법
1. 동적 UI만들기
function Detail(){
let [alert, setAlert] = useState(true);
useEffect(()=>{
setTimeout(()=>{setAlert(false)}, 2000)
}, [])
return(
<div>
{ alert === true ? <div className="alert alert-warning">2초이내 구매시 할인</div> : null}
</div>
)
}
//count라는 state가 변할때만 useEffect가 실행된다
useEffect(()=>{
setTimeout()
},[count])
단, 페이지가 처음 로드될때는 무조건 한 번은 실행을 한다
useEffect(()=>{
let a = setTimeout(()=>{ setAlert(false)}, 2000)
return () =>{
//코드
// 이 함수를 clean up function이라고 한다
// 기존 코드 치우는 코드를 return문 안에 많이 사용한다
clearTimeout(a)
// timer같은 함수를 쓸 때 안전하게 사용할 수 있게 해준다
}
},[count])
function Detail(){
let [num, setNum] = useState('');
useEffect(()=>{
if (isNaN(num) === true){
alert('숫자를 입력해주세요')
}
}, [num]);
//num이라는 state가 변경될때마다 useEffect실행
return (
<input onChange={(e)=>{ setNum(e.target.value) }} />
)
}
문제발생 alert is not a function
-> 위 코드내용 외에도 기존 파일에 alert라는 변수를 사용해서 문제가 발생했음. 기존 변수명을 수정하니 alert함수가 잘 작동했음
useEffect(()=>{/**여기 안에다가 작성하기*/})
useEffect(()=>{}, []) //대괄호 넣기
useEffect(()=>{
return()=>{
// 여기 안에 작성하기
}
})
useEffect(()=>{}, [count]) //대괄호 안에 state명 넣기
useEffect(()=>{
return()=>{}
})