💎 React

리액트 훅, useEffect

ji-hyun 2021. 11. 25. 22:38

Hook낚시바늘이라고 생각하면 된다.

컴포넌트는 등장 -> 업데이트(재렌더링) -> 퇴장Lifecycle 을 거치는데 이때마다 훅을 걸어준다고 생각하면 쉽다.

 

 

예를 들어, 컴포넌트가 등장하기 전에 훅을 걸어서 "그 전에 이것 좀 해줘" 라고 할 수 있는 것이다.

또는 "퇴장 전에 이것 좀 해줘" 가 될 수 있다.

 

 

 

 

 

이것이 훅인데

다시 말해서, Hook 이란 컴포넌트의 LifeCycle 에 딴지를 거는 것이다.

 

 

 

* Hook 으로 컴포넌트의 인생 중간중간에 뭔가 명령을 줄 수 있다.

e.g.) <Detail> 퇴장 전에 이것 좀 해주세요

 

 

 

 

 

 

 

 

 

클래스형 컴포넌트를 쓰고 있을 시절...에는 훅을 이렇게 쓸 수 있었다.

 

 

class Detail2 extends React.Component {

	componentDidMount(){
		// Detail2 컴포넌트가 Mount(등장) 되었을 때 실행할 코드
	}

	componentwillUnmount(){
    		// Detail2 컴포넌트가 Unmount(빠이빠이~) 되기 직전에 실행할 코드
    }
    
}

 

 

 

 

 

 

 

리액트가 업데이트되면서 새로운 훅이 등장했다.

예시 코드는 다음과 같다.

 

 

 

 

useEffect 훅1

 

import React, { useState, useEffect } from 'react';     // import 먼저 해주어야 한다.



function Detail(props){

	useEffect(()=>{    // 컴포넌트가 mount 되었을 때, 컴포넌트가 update 될 때 특정 코드를 실행할 수 있다
    		console.log(11111)   // 랜더링, 업데이트 될때 이 코드가 실행
        });

 

 

 

 

 

 

 

 

 

Detail 페이지 방문 후 alert 창이 2초 후에 사라지게 할 때 사용 할 수 있다.

 

 

import React, { useState, useEffect } from 'react';     



function Detail(props){

	useEffect(()=>{       
    	// 2초 후에 어떤 alert 창을 안보이게 하자
        let 타이머 = setTimeout( ()=> {실행할 코드}, 2000);
        
        });

 

 

 

 

 

 

 

 

 

 

 

useEffect 훅2

컴포넌트가 사라질 때 코드를 실행시킬 수도 있다.

예를 들어, 다른 페이지로 이동한다거나 할 때....

 

 

import React, { useState, useEffect } from 'react';    

	function Detail(props){

		useEffect(()=>{        
    			return function 어쩌구(){실행할코드~~~ }     // 사라질 때 실행할 코드가 실행됨
        	});

 

 

앞에서와는 다르게 return 이 앞에 붙는다. 그리고 이 코드의 의미는 unmount 가 될 때 실행한다고 보면 된다.

 

return ( ) => { }

이렇게 써줘도 된다.

 

 

 

 

 

 

 

 

 

useEffect 훅3

여러개를 사용하고 싶다면 다음과 같이 작성할 수도 있다.

 

import React, { useState, useEffect } from 'react';    



	function Detail(props){      // 1빠로 실행

		useEffect(()=>{        
    	
        });
        
        function Detail(props){     // 2빠로 실행

		useEffect(()=>{        
    	
        });

 

 

 

 

 


import React, { useState, useEffect } from 'react';     



function Detail(props){

let [alert, alert변경] = useState(true);

	useEffect(()=>{       
    	// 2초 후에 어떤 alert 창을 안보이게 하자
        let 타이머 = setTimeout( ()=> {실행할 코드}, 2000);
        
        });
        
        
        return (
        {
            alert === true
            ? (<div className="my-alert2">
            	<p>재고가 얼마 남지 않았습니다</p>
            	</div>)
            : null
            }

 

 

Detail 페이지 접속 후 2초 후에 alert 박스가 사라져야 함

 

 

[ UI 만드는 법 ]

1. UI 보이고 / 안보이고 상태를 state 로 저장

2. if 문 등을 이용해 state 가 true 일 때만 보여준다. 하지만 JSX 에서 { } 안에 if 문은 불가하다.

따라서 삼항 연산자를 써줘야 한다.

 

 

 

 

 

 

Q . 모든 UI 는 이렇게 만듭니까?

A. 네, 항상 보이는 UI 가 아니라면 이렇게 만듭니다.

 

 

 

 

 

import React, { useState, useEffect } from 'react';     



function Detail(props){

let [alert, alert변경] = useState(true);

	useEffect(()=>{       
    	// 2초 후에 어떤 alert 창을 안보이게 하자
        let 타이머 = setTimeout( ()=> {alert변경(false) }, 2000);
        
        });
        
        
        return (
        	{
            alert === true
            ? (<div className="my-alert2">
            	<p>재고가 얼마 남지 않았습니다</p>
            	</div>)
            : null
            }

 

useEffect 는 컴포넌트가 등장/업데이트 시 실행된다.

업데이트 될때 또 저 타이머가 실행될 수 있다. 

 

 

 

 

import React, { useState, useEffect } from 'react';     



function Detail(props){

let [alert, alert변경] = useState(true);
let [inputData, inputData변경] = useState('');

	useEffect(()=>{       
    	// 2초 후에 어떤 alert 창을 안보이게 하자
        let 타이머 = setTimeout( ()=> {alert변경(false) }, 2000);
        
        });
        
        
        return (
        
        {inputData }
        <input onchange={(e)=>{ inputData변경(e.target.value) }} />
        	{
            alert === true
            ? (<div className="my-alert2">
            	<p>재고가 얼마 남지 않았습니다</p>
            	</div>)
            : null
            }

 

여기서 문제

- input 에 뭔가 입력하면 (입력할 때마다) <Detail>컴포넌트가 재렌더링(업데이트) 이 일어난다.

 

그럼 타이머도 실행되고 있다.

다시 말해, input 에 뭔가 입력하면 useEffect() 도 계속 실행된다.

타이머를 맨처음 <Detail> 로드될 때만 실행하고 싶다면 ....

 

 

 

 

 

 

확인

 

let [inputData, inputData변경] = useState('');

	useEffect(()=>{       
    	// 2초 후에 어떤 alert 창을 안보이게 하자
        let 타이머 = setTimeout( ()=> {alert변경(false) }, 2000);
        console.log(1111);     // input 을 입력할 때마다 1111 이 출력되는 것을 볼 수 있다(재렌더링)
        });
        
        
        return (
        
        {inputData }
        <input onchange={(e)=>{ inputData변경(e.target.value) }} />
        	{
            alert === true
            ? (<div className="my-alert2">
            	<p>재고가 얼마 남지 않았습니다</p>
            	</div>)
            : null
            }

 

 

 

 

 

 

 

useEffect 훅4

 

useEffect(() => {
	let 타이며 = setTimeout(()=>{ alert변경(false) }, 2000);
    }, []);   // [] 안은 실행조건

 

useEffect 는 원래 업데이트될 때 항상 실행된다.

[ ] 안은 실행조건으로써 특정 state 가 변경될 때만 실행해준다.

 

 

 

 

 

만약

 

useEffect(() => {
	let 타이며 = setTimeout(()=>{ alert변경(false) }, 2000);
    console.log('안녕');
    }, [alert]);

 

이렇게 코드를 쓴다면 alert 라는 state가 변경이 될 때만 실행된다.

 

따라서 input 을 입력할때마다 재렌더링 되는 Detail 컴포넌트는

useEffect 부분만 빼고 재랜더링 된다.

 

참고 )

'안녕' 이라는 문구가 한번만 실행되는 것을 볼 수 있다.

또한 [ ] 안에는 여러개의 state 변수를 넣을 수 있다.

 

 

 

 

 

 

 

 

 

만약 [ ] 이렇게 빈 칸으로 놔두면 어떻게 될까?

그러면 아무것도 없는 이 공허한 state 가 변경될 때만 useEffect 실행해달라는 뜻이다.

 

그래서 그냥 <Detail> 업데이트시 실행이 안된다.

: <Detail> 등장시 한번 실행하고 끝난다.

 

 

 

useEffect(() => {
	let 타이며 = setTimeout(()=>{ alert변경(false) }, 2000);
    console.log('안녕');
    }, []);
    useEffect(() => {
	let 타이며 = setTimeout(()=>{ alert변경(false) }, 2000);
    console.log('안녕');
    }, []);
    useEffect(() => {
	let 타이며 = setTimeout(()=>{ alert변경(false) }, 2000);
    console.log('안녕');
    }, []);

 

이렇게 쓰면 4번만 등장하고 사라진다.

 

 

 

 

useEffect(() => {
	let 타이며 = setTimeout(()=>{ alert변경(false) }, 2000);
    console.log('안녕');
    return ()=> { clearTimeout(타이머) }    
    }, []);

 

return 은 <Detail> 컴포넌트가 사라질 때 실행할 코드이다.

그러면 <Deail> 컴포넌트가 사라질 때 타이머를 제거해주는 코드를 위처럼 작성하면 된다.

 

 

 

 

 

 

 

'💎 React' 카테고리의 다른 글

장바구니 창 조절  (0) 2021.12.03
상수데이터, 목데이터  (0) 2021.12.01
리액트 댓글 달기  (0) 2021.11.24
props 사용법  (0) 2021.11.22
JSX 안에 조건문, 반복문 쓰는 방법  (0) 2021.11.22