useEffect
: 페이지의 생명주기
[마운트]페이지가 처음 사용자 화면에 보였을때 ⇒ [언마운트]페이지가 사용자 화면에 사라졌을때
위 두 경우를 포함한, 이 사이에서 발생하는 모든 이벤트를 책임
state가 변화했을때 연쇄 이벤트
useEffect(함수, [의존성배열]) // 의존성 배열의 값이 바뀔때 실행할 함수
예시)
의존성 배열이 없기 때문에 페이지가 처음 보였을 때 단 한번만 실행 그럼 만약에 '내'가 state가 변경되었을 때 마다 안녕하세요를 콘솔에 찍어주고 싶다면? 아 그때는, 의존성 배열에 state를 넣어주면 되겠구나
import { useEffect, useState } from "react";
function UseEffect () {
const [state, setState] = useState(false)
useEffect( () => {
console.log("안녕안녕")
}, [state]) // 의존성 배열이 없기 때문에 페이지가 처음 보였을때 단 한번만 실행
const onChangeState = () => {
setState((prev) => !prev)
}
return (
<div>
{state ? "true입니다" : "false입니다"}
<button onClick={onChangeState}>변경</button>
</div>
)
}
export default UseEffect;
그러면, useEffect는 언제 쓰는거야?
페이지 열렸을 때 백엔드와 데이터 통신할때
axios.get(/prod?id=${prodId}).then(
(res) ⇒ { 백엔드에서 보내준 데이터 값 (상품정보, 회원정보, 게시글, 리뷰 .. 리스트)
setProdList(prodlist);
}).catch((err) ⇒ {
const [prodlist, setProdList] = useState()
await axios.get(/prod?id=${prodId}).then((res) => {
res => 백엔드에서 보내준 데이터 값 (상품정보, 회원정보, 게시글, 리뷰 ... 리스트)
setProdList(res.data); // 비동기
if(prodList){
* useState의 set함수는 비동기이기 때문에
* useStaet가 변화한 후 사용하기 위해서는 useEffect[의존성 배열]를 활용
* set함수에 이어서 같은 범위 내에 state함수를 사용하면
* state가 바뀌기 전의 형태가 사용
* 따라서 바뀐 state 값을 활용하기 위해서는 useEffect[의존성 배열]를 활용
}
}).catch((err)=> {})
useEffect(()=>{
if(!prodList) return; // useDidMounted
.. 백엔드에서 받아온 데이터를 가공해야하거나
.. state의 값이 변화 되었을 때 실행해줄 이벤트
.. 연쇄(동기적) 이벤트
setState2("test")
},[prodList])
useEffect(()=>{
setState3("test")
},[state2])
=> set함수는 비동기, 따라서 이후 동기 처리를 위해 effect 사용
=> 한 함수(범위,스코프,블록) 내에서 state가 변화된 값을 쓰지 못함 (비동기이기 때문에)
[리엑트에 있는 엄격 검사모드]
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode> // 이것때문에 렌더링 2번돼서, 콘솔에 두번 뜸
<App />
</React.StrictMode>
);
react는 component 기반이기 때문에
UI가 분리되어 제작되어 있습니다.
따라서 state 값을 공유해야할 필요가 있는데