useEffect를 사용하기에 앞서 useEffect를 왜 사용하는지에 대해 이해하려면
Lifecycle에 대한 개념을 알아야 합니다.
컴포넌트가 생성(mount)이 되거나 재렌더링(update)이 되거나 삭제(unmount)가 될 수도 있습니다.
이 과정을 컴포넌트도 인생이 있다는 것에 비유해서 Lifecycle이라고 합니다.
이 컴포넌트 인생(Lifecycle) 중간중간에 원하는 코드를 실행시킬 수 있도록 도와주는 것이 바로 useEffect입니다.
컴포넌트가 장착이 될때 혹은 업데이트 될 때 특정 코드를 실행시킬 수 있다면 더 재밋는 기능을 개발할 수 있습니다.
class App extends React.Component {
componentDidMount(){
//App 컴포넌트가 로드되고나서 실행할 코드
}
componentDidUpdate(){
//App 컴포넌트가 업데이트 되고나서 실행할 코드
}
componentWillUnmount(){
//App 컴포넌트가 삭제되기전에 실행할 코드
}
}
import {useState, useEffect} from 'react';
const App = () => {
useEffect(()=>{
//여기 작성한 코드는 컴포넌트 mount 혹은 update시 실행됩니다.
});
return (
<>
<div></div>
</>
)
}
물론 useEffect 밖에 작성한 코드도 mount, update시 실행이 되지만 useEffect 안에 작성한 코드는 html 렌더링 이후에 동작합니다.
html 렌더링 이후에 동작한다는 얘기는 실행이 오래걸리는 코드들을 useEffect 안에 작성해놓으면 렌더링이 더 빠른 사이틑 구성할 수 있다고 할 수 있습니다.
import {useState, useEffect} from 'react';
const App = () => {
const [appear, setAppear] = useState(true);
useEffect(()=>{
//여기 작성한 코드는 컴포넌트 mount 혹은 update시 실행됩니다.
const timer = setTimeout(() => {
setAppear(false);
}, 2000);
}, []);
return (
<>
{appear == true ? <div>2초이내 구매시 할인</div> : <></>}
</>
)
}
import {useState, useEffect} from 'react';
const App = () => {
const [appear, setAppear] = useState(true);
const [inputValue, setInputValue] = useState('');
useEffect(()=>{
//여기 작성한 코드는 컴포넌트 mount 혹은 update시 실행됩니다.
const timer = setTimeout(() => {
setAppear(false);
}, 2000);
}, [inputValue]);
// 여기서 []의 역할은 useEffect 실행조건을 넣은 수 있습니다.
// []가 없을 경우에는 컴포넌트가 mount, update 될 때 실행됩니다.
return (
<>
{appear == true ? <div>2초이내 구매시 할인</div> : <></>}
</>
)
}
Dependency가 없을 때는 useEffect안의 코드는 컴포넌트가 mount, update 될 때 실행됩니다.
[변수]를 추가하게 되면 []안의 state가 변할때만 실행됩니다!
Dependency가 있어도 처음 mount될시에는 실행됩니다.
만약 Dependency안에 아무것도 않넣으면 컴포넌트가 mount시 1회만 실행하고 다시 실행하지 않습니다.
-> 1회만 실행시키고 싶으면 [] 형태로 작성하면 됩니다.
useEffect 안에 "return () => {}" 작성하게 되면 useEffect 동작 전에 실행됩니다.
예를 들어 clean up function을 통해 기존에 있던 코드 동작을 없앨 수 있습니다.(데이터 요청코드)
clean up function은 처음 mount시에는 실행되지 않고 unmount(삭제)시에는 실행됩니다.
import {useState, useEffect} from 'react';
const App = () => {
const [appear, setAppear] = useState(true);
const [inputValue, setInputValue] = useState('');
useEffect(()=>{
//여기 작성한 코드는 컴포넌트 mount 혹은 update시 실행됩니다.
const timer = setTimeout(() => {
setAppear(false);
}, 2000);
}, [inputValue]);
// 여기서 []의 역할은 useEffect 실행조건을 넣은 수 있습니다.
// []가 없을 경우에는 컴포넌트가 mount, update 될 때 실행됩니다.
return (
<>
clearTimeout(timer);
</>
)
}
useEffect( () => {} );
useEffect( () => {}, []);
useEffect( () => {
return () => {
}
}, []);
useEffect( () => {
return () => {
clean up function
}
}, []);
useEffect( () => {
return () => {
}
}, [state 명]);