React Hooks haben die Art und Weise, wie wir funktionale Komponenten in React schreiben, revolutioniert und bieten eine übersichtliche und leistungsstarke Möglichkeit, Zustände und Seiteneffekte zu verwalten.

Doch wie bei jeder neuen Funktion gibt es auch hier Regeln und Richtlinien. Ein häufiger Fehler, auf den React-Entwicklerinnen und -Entwickler stoßen können, ist der Fehler „React Hooks müssen in einer React Funktionskomponente oder einer benutzerdefinierten React Hook-Funktion aufgerufen werden“.

In diesem Artikel gehen wir auf die Details dieses Fehlers ein, erklären, warum er auftritt, und zeigen, wie man ihn beheben kann.

Was ist die Ursache für den Fehler „React Hooks müssen in einer React Funktionskomponente oder einer benutzerdefinierten React Hook Funktion aufgerufen werden“?

Bei der Verwendung von React Hooks gibt es bestimmte Regeln. Viele React-Entwicklerinnen und -Entwickler übergehen diese Regeln beim Erlernen von React, was zu Fehlern führt. Einer dieser Fehler lautet: „React Hooks müssen in einer React Function-Komponente oder einer benutzerdefinierten React Hook-Funktion aufgerufen werden“.

Dieser Fehler tritt auf, wenn zwei wichtige Dinge passieren:

  • Verwendung von React Hooks in Klassenkomponenten
  • Aufrufen von React Hooks innerhalb einer verschachtelten Funktion

React Hooks, wie useState, useEffect und useContext, sind dafür gedacht, auf der obersten Ebene einer funktionalen Komponente oder einer benutzerdefinierten Hook-Funktion aufgerufen zu werden. Außerdem sollten sie nur in funktionalen Komponenten und nicht in Klassenkomponenten aufgerufen werden. Dies sind zwei wichtige Regeln von React Hooks, die sicherstellen, dass Hooks in React-Komponenten korrekt und konsistent verwendet werden.

Wenn Hooks an ungültigen Stellen aufgerufen werden, erhältst du diese Fehlermeldung: „React Hooks müssen in einer React Function-Komponente oder einer benutzerdefinierten React Hook-Funktion aufgerufen werden“. Dieser ESLint-Fehler soll verhindern, dass Hooks auf eine Weise verwendet werden, die zu unerwartetem Verhalten und Fehlern in deiner React-Anwendung führen kann.

2 Möglichkeiten, den Fehler „React Hooks müssen in einer React-Funktionskomponente oder einer benutzerdefinierten React-Hook-Funktion aufgerufen werden“ zu beheben

Dieser Fehler kann auf verschiedene Arten behoben werden, je nachdem, wie du den React Hook missbräuchlich verwendet hast.

1. React Hooks niemals in Klassenkomponenten aufrufen

Hooks sind nur für funktionale Komponenten oder benutzerdefinierte Hooks gedacht – denn sie nutzen den Call Stack der funktionalen Komponenten, um den Zustand und den Lebenszyklus der Komponente zu verwalten. Klassenkomponenten verfügen nicht über diesen Call Stack, daher kannst du Hooks nicht direkt in ihnen verwenden.

import React, { useState } from 'react';
class Counter extends React.Component {
    state = { count: 0 };
    render() {
        const [count, setCount] = useState(0);
        // Error: React Hooks must be called in a React function component or a custom React Hook function
        return (
            <div>
                <p>You clicked {count} times</p>
                <button onClick={() => setCount(count + 1)}>Click me</button>
            </div>
        );
    }
}
export default Counter;

Wenn du das tust, bekommst du diesen Fehler:

Fehler in der React-Funktion
Fehler in der React-Funktion

Es gibt jedoch einige Möglichkeiten, dies zu beheben, je nachdem, was du bevorzugst. Du kannst dich entscheiden, state und setState mit Klassenkomponenten zu verwenden, die Komponente in eine funktionale Komponente umzuwandeln oder eine Higher-Order Component (HOC) zu verwenden.

A. Die Klassenkomponente in eine funktionale Komponente umwandeln

Hooks können nur dann funktionieren, wenn du eine funktionale Komponente verwendest. Das liegt daran, dass Hooks für die Arbeit mit funktionalen Komponenten konzipiert sind.

Im folgenden Beispiel wird die vorherige Klassenkomponente in eine funktionale Komponente umgewandelt:

import { useState } from 'react';

function MyComponent(props) {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

B. Eine übergeordnete Komponente (HOC) verwenden

Eine Möglichkeit, Hooks in einer Klassenkomponente zu verwenden, ist die Verwendung einer Higher-Order Component (HOC).

Eine HOC ist eine Funktion, die eine Komponente nimmt und eine neue Komponente mit zusätzlichen Eigenschaften oder Funktionen zurückgibt. Hier ist ein Beispiel dafür, wie du eine HOC verwenden kannst, um einer Klassenkomponente Hooks zu geben:

import React, { useState } from 'react';

function withHooks(WrappedComponent) {
  return function(props) {
    const [count, setCount] = useState(0);
    return (
      < WrappedComponent count={count} setCount={setCount} {...props} />
    );
  };
}

class MyComponent extends React.Component {
  render() {
    const { count, setCount } = this.props;
    return (
      < div>
        < p>Count: {count}< /p>
        < button onClick={() => setCount(count + 1)}>Increment< /button>
      < /div>
    );
  }
}

export default withHooks(MyComponent);

C. Zustände in einer Klassenkomponente verwenden

Angenommen, du willst die Syntax deiner Komponente nicht ändern. Du kannst dich entscheiden, state und setState anstelle des useState Hooks zu verwenden:

import React from 'react';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  handleIncrement = () => {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.handleIncrement}>Increment</button>
      </div>
    );
  }
}

export default MyComponent;

2. Niemals React Hooks innerhalb einer verschachtelten Funktion aufrufen

Eine klare Regel für React Hooks ist, dass alle Hooks auf der obersten Ebene einer funktionalen Komponente oder einer eigenen Hook-Funktion aufgerufen werden sollten. Wenn du eine Hook innerhalb einer verschachtelten Funktion aufrufst, hast du gegen diese Regel verstoßen.

Im folgenden Beispiel wird der useState Hook in der Funktion handleClick aufgerufen:

import React, { useState } from 'react';
function MyComponent() {
    let count = 0;
    function handleClick() {
        const [count, setCount] = useState(0);
        setCount(count + 1);
    }
    return (
        <div>
            <p>Count: {count}</p>
            <button onClick={handleClick}>Increment</button>
        </div>
    );
}

export default MyComponent;

Dadurch wird der folgende Fehler ausgelöst:

Ein weiterer React-Fehler
Ein weiterer React-Fehler

Du kannst das Problem beheben, indem du den Hook außerhalb der Funktion verschiebst – auf die oberste Ebene deiner Funktionskomponente:

import React, { useState } from 'react';

function MyComponent() {
    const [count, setCount] = useState(0);

    function handleClick() {
        setCount(count + 1);
    }

    return (
        <div>
            <p>Count: {count}</p>
            <button onClick={handleClick}>Increment</button>
        </div>
    );
}

export default MyComponent;

Zusammenfassung

In diesem Artikel hast du erfahren, was den Fehler „React Hooks müssen in einer React-Funktionskomponente oder einer benutzerdefinierten React-Hook-Funktion aufgerufen werden“ verursacht und wie er behoben werden kann.

Befolge immer die Regeln für React Hooks, wenn du mit ihnen arbeitest und sie in deinen React-Projekten verwendest, um Fehler wie diesen zu vermeiden.

Du suchst nach der idealen Hosting-Lösung für deine React-Anwendungen? Teste das Anwendungs-Hosting von Kinsta kostenlos!

Wir wollen von dir hören! Hast du diesen Fehler schon einmal erlebt? Wenn ja, wie hast du ihn behoben? Hast du eine andere Lösung gefunden, die nicht in diesem Artikel beschrieben wurde? Teile uns deine Meinung in den Kommentaren unten mit!