본문 바로가기
카테고리 없음

React - Effect Hook

by hustle-ing 2023. 4. 3.

Hook의 2가지 규칙

  • 최상위(at the Top Level)에서만 Hook을 호출해야 한다
  • 오직 React 함수 내에서 Hook을 호출해야 한다.

 

useEffect의 3가지 형태

1. 아무것도 넣지 않기(기본 형태) - useEffect(함수)

컴포넌트가 처음 생성되거나, props가 업데이트 되거나, state가 업데이트 될 때 effect 함수가 실행된다.

 

2. 빈 배열 넣기 - useEffect(함수, [])

컴포넌트가 처음 생성될 때만 effect 함수가 실행된다. 대표적으로 처음 단 한 번, 외부 API를 통해 리소스를 받아오고 더 이상 API 호출이 필요하지 않을 때 사용할 수 있다.

 

3. useEffect(함수, [종속성1, 종속성2, ... ])

배열 내의 종속성1, 또는 종속성 2의 값이 변할 때 함수가 실행된다. 즉, 배열 내의 어떤 값이 변할 때에만 함수가 실행된다.

 

 

 

AJAX 요청 보내기

useEffect(() => {
  fetch(`http://서버주소/proverbs?q=${filter}`)
    .then(resp => resp.json())
    .then(result => {
      setProverbs(result);
    });
}, [filter]);

 

 

 

로딩 화면(loading indicator)의 구현

모든 네트워크 요청이 항상 즉각적인 응답을 가져다 주는 것은 아니다. 외부 API 접속이 느릴 경우를 고려하여, 로딩 화면의 구현은 필수적이다.

const [isLoading, setIsLoading] = useState(true);

// 생략, LoadingIndicator 컴포넌트는 별도로 구현했음을 가정합니다
return {isLoading ? <LoadingIndicator /> : <div>로딩 완료 화면</div>}

 

fetch 요청의 전후로 setIsLoading을 설정해 주어 보다 나은 UX를 구현할 수 있다.

useEffect(() => {
  setIsLoading(true);
  fetch(`http://서버주소/proverbs?q=${filter}`)
    .then(resp => resp.json())
    .then(result => {
      setProverbs(result);
      setIsLoading(false);
    });
}, [filter]);

댓글