본문 바로가기
SPA/React

React Effect Hook

by memeseo 2022. 11. 7.

useEffect ?

  • useEffect 함수는 Component가 mount 됐을 때, unmount 됐을 때, update 됐을 때 특정 작업을 실행할 수 있도록 해주는 Hook이다.
  • 클래스형 컴포넌트에서 사용할 수 있었던 생명주기 메소드를 함수형 컴포넌트에서도 사용할 수 있게 된 것.

 


사용 방법

* 기본 형태 : useEffect(function, deps)
- function : 수행하고자 하는 작업
- deps : 배열 형태이며, 배열 안에는 검사하고자 하는 특정 값 혹은 빈 배열이 들어간다.

 

1. 함수 불러오기

 

import {useEffect} from 'react';

 

2. Component가 Mount 됐을 때 실행

 

useEffect(()=>{
     console.log('마운트 될때만 실행~');
}, []);

 

컴포넌트가 화면에 처음 렌더링 될 때만 실행하고 싶을 때는 위와 같이 deps위치에 빈 배열을 넣는다.

배열을 생략한다면 리렌더링이 될 때마다 실행된다.

 

3. Component가 Update 될 때 (특정 props, state가 바뀔 때)

 

function App(){
	
	const [keyword, setKeyword] = useState("");
    const onChange = (evnet) => setKeyword(event.target.value);
    useEffect(()=>{
    	console.log('값이 변화할 때만 난 호출되지~');
    }, [keyword]);
    
	return (
    	<div>
        	<input type="text"
            value={keyword}
            onChange={onChange}
            placeholder="Search here..."
            >
        </div>
    )
}

 

특정 값이 업데이트될 때 실행하고 싶다면 deps 에 검사하고 싶은 값을 넣어준다.

참고로 업데이트될 때만 실행되는 것이 아니라 마운트 될 때도 실행 되기 때문에 업데이트될 때만 특정 함수를 실행하고 싶다면 아래와 같은 꼼수를 써야 한다.

 

function App(){
	const mounted = useRef(false);
	const [keyword, setKeyword] = useState("");
    const onChange = (evnet) => setKeyword(event.target.value);
    useEffect(()=>{
    	if(!mounted.current){
        	mounted.current = true;
        }else{
        	console.log('값이 변화할 때만 난 호출되지~');
        }
    	
    }, [keyword]);
    
	return (
    	<div>
        	<input type="text"
            value={keyword}
            onChange={onChange}
            placeholder="Search here..."
            >
        </div>
    )
}

 

mounted 전이라면 mounted 현재 값을 바꿔주고,mounted 후 라면 배열 안에 있는 값이 업데이트 될 때만 코드가 실행된다.

 

3. Component가 unmount 될 때

 

function Hello(){
	useEffect(()=>{
    	console.log("created :)");
        return () => console.log("destroyed :(");
    }, [])
	return <h1>Hello</h1>
}

function App(){

	const [showing, setShowing] = useState(false);
    const onClick = () => setShowing((prev)=>!prev);
    
    return (
    	<div>
        	{showing ? <Hello/> : null}
        	<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
        </div>
    )
}

 

showing이 true일 때 Hello 컴포넌트가 출력되는 코드이다.

Hello 컴포넌트가 생성되면 console을 통해 'created :)'가 찍히고,

useEfftect의 cleanup 함수를 통해 'destoryed :('가 찍힌다.

 

사용 후기로는 vue가 react보다 라이프사이클이 커스텀 가능하게 자잘하게 잘려서 제공된 느낌이다. react는 effect로 vue의 mounted, destroyed, watch, computed의 역할을 다 수행한다. (vue는 심지어 beforeMounted, beforeCreated, beforeDestoryed도 있음) 아직 어떤 게 더 편리하고 좋은지 장단점을 알기에는 코드 작성을 많이 안 해봐서 모르겠지만 같은 목표를 수행하기 위해 다른 방법으로 서비스를 제공하는 게 흥미롭다. like 공모전 PPT 같은 .. 

 

'SPA > React' 카테고리의 다른 글

React Router  (0) 2022.11.21
React Props 그리고 vue에는 없는 신기한 함수  (0) 2022.11.01
React State  (0) 2022.10.26
JSX 문법  (0) 2022.10.19
vanilla.js vs react.js  (0) 2022.10.19