React에서 useEffect가 두 번 실행되는 이유

4700 단어 react
최근에 Create React App을 사용하여 새 프로젝트를 만든 경우
또는 React 버전 18로 업그레이드하면 개발 모드에서 useEffect 후크가 두 번 실행되는 것을 볼 수 있습니다.

useEffect 후크를 처음 사용하는 경우 이전 기사(a complete guide to useEffect hook) 중 하나를 읽을 수 있습니다.

문제 복제



다음 명령을 사용하여 새로운 반응 앱을 만듭니다.

npx create-react-app react-use-effect-twice


다음 코드로 업데이트App.js:

import { useEffect } from "react"

function App() {
  useEffect(() => {
    console.log("useEffect executed (component mounted)")
  }, [])

  return <div className="App"></div>
}

export default App


여기에 useEffect 후크가 있고 그 안에 메시지를 기록하고 있습니다.

애플리케이션을 실행하고 브라우저 콘솔을 열면 메시지가 두 번 표시되는 것을 볼 수 있습니다.



문제 이해



StrictMode 에서는 React 18부터 개발 모드에서 효과가 마운트되고 마운트 해제되었다가 다시 마운트됩니다.

이는 프로덕션 모드가 아닌 개발 모드에서만 발생합니다.

이것은 향후 React가 상태를 유지하면서 UI 섹션을 추가하거나 제거할 수 있는 기능을 도입하는 데 도움이 되도록 추가되었습니다. 예를 들어 탭 사이를 전환하는 동안 이전 탭의 상태를 유지하면 API 호출과 같은 불필요한 효과 실행을 방지하는 데 도움이 됩니다.

useEffect 후크에 정리 함수를 추가하여 동작을 확인할 수 있습니다.

import { useEffect } from "react"

function App() {
  useEffect(() => {
    console.log("useEffect executed (component mounted)")
    return () => {
      console.log("useEffect cleanup (component unmounted)")
    }
  }, [])

  return <div className="App"></div>
}

export default App


애플리케이션을 실행하면 브라우저 콘솔에 다음 메시지가 표시됩니다.



문제 해결



이전 섹션을 읽었다면 이것은 실제로 문제가 아닙니다. 따라서 고정이 필요하지 않습니다.

그래도 useEffect가 두 번 호출되지 않도록 하려면 <StickMode> 파일에서 index.js 태그를 제거하면 됩니다.

좋은 웹페이지 즐겨찾기