Heim > Web-Frontend > js-Tutorial > Warum wird mein React-useEffect-Hook auch mit einem leeren Abhängigkeitsarray mehrmals ausgeführt?

Warum wird mein React-useEffect-Hook auch mit einem leeren Abhängigkeitsarray mehrmals ausgeführt?

Linda Hamilton
Freigeben: 2024-12-21 04:23:10
Original
1055 Leute haben es durchsucht

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

Die Frage
Bei der Arbeit an einem React-Projekt bin ich auf ein Problem mit dem useEffect-Hook gestoßen. Mein Ziel war es, Daten nur einmal von einer API abzurufen, wenn die Komponente bereitgestellt wird. Der useEffect wurde jedoch mehrmals ausgeführt, obwohl ich ein leeres Abhängigkeitsarray bereitgestellt habe.

Hier ist der Codeausschnitt:

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;
Nach dem Login kopieren


Trotz des leeren Abhängigkeitsarrays ([]) wurde useEffect mehrmals ausgeführt. Ich habe versucht, den Entwicklungsserver neu zu starten, aber das Problem blieb bestehen. Nach einiger Recherche und Fehlerbehebung habe ich die Grundursache identifiziert und behoben.
Die Antwort

Warum das passiert

Strikter Modus in der Entwicklung:

Wenn Ihre App im Entwicklungsmodus von React mit aktiviertem StrictMode ausgeführt wird, mountet und unmountet React Komponenten absichtlich mehrmals. Dies ist ein reines Entwicklungsverhalten, das dazu dient, Nebenwirkungen zu erkennen, die Probleme verursachen können.

Erneutes Rendern oder Hot Module Replacement (HMR):

Während der Entwicklung können Änderungen im Code einen Hot Module Replacement auslösen, was dazu führt, dass die Komponente erneut gerendert und useEffect erneut ausgeführt wird.

So beheben oder behandeln Sie dieses Verhalten

Strikten Modus identifizieren:

Wenn Sie StrictMode verwenden, beachten Sie, dass dieses Verhalten nur in der Entwicklung auftritt und keine Auswirkungen auf den Produktions-Build hat. Sie können es vorübergehend deaktivieren, indem Sie
entfernen

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


Es ist jedoch besser, es aktiviert zu lassen und Ihren Code anzupassen, um potenzielle Nebenwirkungen reibungslos zu bewältigen.

Doppelte API-Aufrufe verhindern:

Verwenden Sie ein Flag, um sicherzustellen, dass der API-Aufruf nur einmal während des Lebenszyklus der Komponente erfolgt, sogar

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;
Nach dem Login kopieren

Durch die Verwendung einer useRef wird sichergestellt, dass der API-Aufruf nur einmal erfolgt, unabhängig von den zusätzlichen Renderings, die durch StrictMode verursacht werden.

Wichtige Erkenntnisse
. Der strikte Modus von React in der Entwicklung ist beabsichtigt und kann bedenkenlos aktiviert bleiben.
. Bei Produktionsversionen tritt dieses Problem nicht auf. . Verwenden Sie bei Bedarf useRef oder andere Techniken, um Nebenwirkungen zu bewältigen.
Verwenden Sie bei Bedarf useRef oder andere Techniken, um Nebenwirkungen zu bewältigen.
Bei Produktionsversionen tritt dieses Problem nicht auf.
Verwenden Sie bei Bedarf useRef oder andere Techniken, um Nebenwirkungen zu bewältigen.

Das obige ist der detaillierte Inhalt vonWarum wird mein React-useEffect-Hook auch mit einem leeren Abhängigkeitsarray mehrmals ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage