>웹 프론트엔드 >JS 튜토리얼 >빈 종속성 배열이 있어도 React useEffect 후크가 여러 번 실행되는 이유는 무엇입니까?

빈 종속성 배열이 있어도 React useEffect 후크가 여러 번 실행되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-21 04:23:10990검색

Why does my React useEffect hook run multiple times even with an empty dependency array?

질문
React 프로젝트에서 작업하는 동안 useEffect 후크에 문제가 발생했습니다. 내 목표는 구성 요소가 마운트될 때 한 번만 API에서 데이터를 가져오는 것이었습니다. 그러나 빈 종속성 배열을 제공했는데도 useEffect가 계속 여러 번 실행되었습니다.

코드 스니펫은 다음과 같습니다.

import React, { useEffect, useState } from "react";
import axios from "axios";

const MyComponent = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    console.log("Fetching data...");
    axios.get("https://jsonplaceholder.typicode.com/posts")
      .then(response => setData(response.data))
      .catch(error => console.error(error));
  }, []);
  return (
    <div>
      <h1>Data</h1>
      <ul>
        {data.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
};
export default MyComponent;


빈 종속성 배열([])에도 불구하고 useEffect가 여러 번 실행되었습니다. 개발 서버를 다시 시작해 보았으나 문제가 지속되었습니다. 몇 가지 조사와 문제 해결 후에 근본 원인을 파악하고 해결했습니다.
대답

왜 이런 일이 발생하는가

개발 중인 엄격 모드:

앱이 StrictMode가 활성화된 React 개발 모드에서 실행 중인 경우 React는 의도적으로 구성 요소를 여러 번 마운트 및 마운트 해제합니다. 이는 문제를 일으킬 수 있는 부작용을 감지하기 위한 개발 전용 동작입니다.

재렌더링 또는 핫 모듈 교체(HMR):

개발 중에 코드 변경으로 인해 핫 모듈 교체가 트리거되어 구성 요소가 다시 렌더링되고 useEffect가 다시 실행될 수 있습니다.

이 동작을 수정하거나 처리하는 방법

엄격 모드 식별:

StrictMode를 사용하는 경우 이 동작은 개발 중에만 발생하며 프로덕션 빌드에는 영향을 미치지 않는다는 점을 이해하세요. 제거하여 일시적으로 비활성화할 수 있습니다

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));  


그러나 활성화된 상태로 두고 잠재적인 부작용을 적절하게 처리하도록 코드를 조정하는 것이 좋습니다.

중복 API 호출 방지:

플래그를 사용하여 구성 요소의 수명 주기 동안 API 호출이 한 번만 발생하는지 확인하세요.

import React, { useEffect, useState, useRef } from "react";
import axios from "axios";

const MyComponent = () => {
  const [data, setData] = useState([]);
  const isFetched = useRef(false);

  useEffect(() => {
    if (isFetched.current) return;

    console.log("Fetching data...");
    axios.get("https://api.example.com/data")
      .then(response => setData(response.data))
      .catch(error => console.error(error));

    isFetched.current = true;
  }, []);

  return (
    <div>
      <h1>Data</h1>
      <ul>
        {data.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
};
export default MyComponent;

useRef를 사용하면 StrictMode로 인한 추가 렌더링에 관계없이 API 호출이 한 번만 발생합니다.

주요 시사점
. 개발 중인 React의 Strict 모드는 의도적이며 그대로 두어도 안전합니다.
. 프로덕션 빌드에는 이 문제가 발생하지 않습니다. . 필요한 경우 useRef 또는 기타 기술을 사용하여 부작용을 관리하세요.
필요한 경우 useRef 또는 기타 기술을 사용하여 부작용을 관리하세요.
프로덕션 빌드에는 이 문제가 발생하지 않습니다.
필요한 경우 useRef 또는 기타 기술을 사용하여 부작용을 관리하세요.

위 내용은 빈 종속성 배열이 있어도 React useEffect 후크가 여러 번 실행되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.