useEffect() 사용법
useEffect()는 리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 Hook이다.
기본 형태 :
useEffect( function, deps )
- function : 수행하고자 하는 작업
- deps : 배열 형태이며, 배열 안에는 검사하고자 하는 특정 값 or 빈 배열
useEffect 함수 불러오기
import React, { useEffect } from 'react';
1. Component가 mount 됐을 때 (처음 나타났을 때)
컴포넌트가 화면에 가장 처음 렌더링 될 때 한 번만 실행하고 싶을 때는 deps 위치에 빈 배열을 넣는다.
useEffect(() => {
console.log('마운트 될 때만 실행된다');
}, []);
배열을 생략한다면 리렌더링 될 때 마다 실행된다.
useEffect(() => {
console.log('렌더링 될 때 마다 실행.');
});
2. Component가 update 될 때 (특정 props, state가 바뀔 때)
특정값이 업데이트 될 때 실행하고 싶을 때는 deps 위치의 배열 안에 검사하고 싶은 값을 넣어준다.
(의존값이 들어있는 배열 deps 이라고도 한다. dependency를 의미.)
useEffect(() => {
console.log(hello);
console.log('업데이트 될 때 실행.');
}, [hello]);
업데이트 될 때만 실행하는 것이 아니라 마운트 될 때도 실행된다.
따라서 업데이트 될 때만 특정 함수를 실행하고 싶다면 아래와 같은 꼼수?를 사용하면 좋다.
const mounted = useRef(false);
useEffect(() => {
if(!mounted.current){
mounted.current = true;
} else {
//ajax
}
},[바뀌는 값]);
useRef는 .current 프로퍼티에 변경 가능한 값을 담고 있는 상자 같은 것이라 할 수 있다.
컴포넌트가 마운트 될 때
if 문에서 아무것도 실행하지 않고 mounted 값만 바꿔주고,
else에서 배열 안에 있는 값이 바뀌면
ajax 서버 통신같이 원하는 코드를 실행할 수 있다.
3. Component가 unmount 될 때(사라질 때) & update 되기 직전
cleanup 함수 반환 (return 뒤에 나오는 함수이며 useEffect에 대한 뒷정리 함수라고 한다.)
useEffect(() => {
console.log('hello');
console.log(hello);
return () => {
console.log('cleanup');
console.log(hello);
};
}, []);
언마운트 될 때만 cleanup 함수를 실행하고 싶을 때
두 번째 파라미터로 빈 배열을 넣는다.
특정값이 업데이트 되기 직전에 cleanup 함수를 실행하고 싶을 때
deps 배열 안에 검사하고 싶은 값을 넣어준다.
deps 에 특정 값 넣기
deps 에 특정 값을 넣게 된다면 컴포넌트가 처음 마운트 될 때, 지정한 값이 바뀔 때, 언마운트 될 때, 값이 바뀌기 직전에 모두 호출이 된다.
useEffect 안에서 사용하는 상태나, props 가 있다면, useEffect 의 deps 에 넣어주어야 하는 것이 규칙이다.
만약 사용하는 값을 넣어주지 않는다면, useEffect 안의 함수가 실행될 때 최신 상태, props를 가리키지 않는다.
deps 파라미터를 생략한다면, 컴포넌트가 리렌더링 될 때마다 useEffect 함수가 호출된다.
참고 : https://ko.reactjs.org/docs/hooks-effect.html https://xiubindev.tistory.com/100
'💎 리액트' 카테고리의 다른 글
React input radio default checked 설정(리액트 radio 기본값) (0) | 2022.03.04 |
---|---|
리액트 button 태그 자동 클릭되는 현상 막는 법 (0) | 2022.03.03 |
리액트 검색기능 구현 (스프링부트, 리액트 연동 쇼핑몰 검색 기능 구현) (0) | 2022.03.03 |
리액트 : 부모 컴포넌트에서 자식 컴포넌트 함수 호출하는 법 (0) | 2022.03.02 |
리액트 key 할당해도 해결 안되는 문제. Warning:Each child in an array or iterator should have a unique"key"prop. (0) | 2022.02.28 |
댓글