React18 useEffectEvent

2024. 12. 30. 17:00·React

기존 useEffect에서의 외부 함수 호출

외부함수가 일반함수일 때: 의존성 배열에 함수를 포함하지 않으나 외부함수에 사용되는 디펜던시를 포함

function logSearch(results) {
	console.log(`검색어: ${keyword}, 필터: ${filters}, 결과 수: ${results.length}`);
}

useEffect(() => {
    fetchResults(keyword).then(results => {
      logSearch(results);
    });
}, [keyword, filters]);
  • filters가 변경될 때마다 effect가 실행되므로 의도되지 않은 API 호출 발생
  • filters를 의존성 배열에서 제거하면 문제를 해결할 수 있지만 ESLint 경고 발생하므로 올바른 접근이 아님

외부 함수가 useCallback으로 감싸져 있을 때: 함수를 의존성 배열에 포함 필요

const logSearch = useCallback((results) => {
	console.log(`검색어: ${keyword}, 필터: ${filters}, 결과 수: ${results.length}`);
}, [keyword, filters]);

useEffect(() => {
    fetchResults(keyword).then(results => {
      logSearch(results);
    });
}, [keyword, logSearch]);
  • 일반함수 호출과 마찬가지로 filters가 변경될 때마다 logSearch 함수가 재생성되어 effect가 실행되므로 의도되지 않은 API 호출 발생

useEffectEvent

React 18.3에서 도입된 새로운 Hook으로, 내부의 로직 중 의존성 추적이 필요하지 않은 부분을 분리할 수 있게 해줍니다.

특징

 

  • Effect 내부에서 사용되는 함수를 의존성 없이 최신 값으로 유지
  • 항상 최신 props와 state를 참조
  • 제한되는 경우
    • useEffect 외부에서 호출 불가
    • async 함수로 선언 불가
    • 다른 함수에 콜백으로 전달 불가

 

const logSearchEvent = useEffectEvent((results) => {
	console.log(`검색어: ${keyword}, 필터: ${filters}, 결과 수: ${results.length}`);
});

useEffect(() => {
    fetchResults(keyword).then(results => {
      logSearchEvent(results);
    });
}, [keyword]); // filters 제거 가능
  • useEffect가 filters를 의존성으로 가지지 않으므로 불필요한 호출이 발생하지 않음
  • logSearchEvent 호출 시에도 항상 최신 filters 값 사용
저작자표시 비영리 변경금지 (새창열림)

'React' 카테고리의 다른 글

React Core 구현하기 - 2. JSX 런타임 로직  (0) 2025.02.18
React Core 구현하기 - 1. JSX 컴파일  (0) 2025.02.14
React useLayoutEffect  (2) 2024.12.27
React forwardRef와 useImperativeHandle  (0) 2024.12.27
리액트 파이버의 동작  (0) 2024.12.23
'React' 카테고리의 다른 글
  • React Core 구현하기 - 2. JSX 런타임 로직
  • React Core 구현하기 - 1. JSX 컴파일
  • React useLayoutEffect
  • React forwardRef와 useImperativeHandle
URE
URE
Skill: Javascript, ReactJS, Next.js, React Native ... *블로그 이전 작업(24. 04. 11 ~ 24. 04. 15)
  • URE
    Dev++
    URE
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Browser (6)
      • OS (1)
      • Javascript (14)
      • React (19)
      • Next.js (4)
      • React Native (0)
      • Architecture (1)
      • Network (3)
      • 스크랩 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dataFetching
    자바스크립트
    react18
    상태관리라이브러리
    URL
    리액트
    리덕스
    리액트 코어
    react concurrent
    TCP
    Port
    브라우저
    JS
    참조타입
    원시타입
    swr
    javascript
    Redux
    react
    IP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
URE
React18 useEffectEvent
상단으로

티스토리툴바