React: Spannung aus Hooks auslösen

Erstellt am 14. Feb. 2019  ·  3Kommentare  ·  Quelle: facebook/react

Möchten Sie eine Funktion anfordern oder einen Fehler melden?

Frage. Dies kann auch mit #14563 zusammenhängen.

Wie lösen wir Spannung von einem Haken aus?

Warum kam die Frage?

Diese Frage kam während unserer Verwendung von react-i18next . Ein aktuelles Update von react-i18next hat den useTranslation -Hook bereitgestellt, der das Abrufen der aktuellen Übersetzungen ermöglicht und auch das Laden von noch nicht geladenen Übersetzungs-Namespaces auslöst (ein bisschen wie Code-Splitting).

Um den Fall zu handhaben, dass die Übersetzungen noch nicht geladen sind, wirft der useTranslation -Hook ein Versprechen, Suspense auszulösen, was eigentlich sehr nett ist, weil es sich sauber in die vorhandenen Reaktionsfunktionen integriert!

Wenn Sie jedoch nach dem Aufruf des useTranslation -Hooks weitere Hooks verwenden, werden diese anderen Hooks nicht gerendert, wenn useTranslation das Versprechen wirft. Sobald die Übersetzungen geladen sind, wirft der Hook nicht mehr und reagiert mit einer großen roten Warnung, dass sich die Anzahl der Hooks geändert hat.

Beispiel

const Component = () => {
  const [t] = useTranslation('translationnamespace');
  const [count, setCount] = useState(0);

  return (
    <div onClick={() => setCount(count + 1)}>
      {t('The count is:')} {count}
    </div>
  );
};

Wenn translationnamespace noch nicht geladen ist, wird useTranslation geworfen, wodurch useState nicht gerendert wird. Sobald translationnamespace geladen ist, wird useTranslation nicht mehr ausgelöst, was dazu führt, dass useState gerendert wird und die Warnung verursacht.

Der allgemeine Fall

Diese Frage gilt also nicht nur für React-i18next, sondern für alle Hooks, die Spannung auslösen wollen. Wie würden wir das machen und wie würde dies in die aktuellen "Regeln für Hooks" integriert, die besagen, dass Hooks nicht bedingt gerendert werden dürfen?

Hooks Suspense Bug

Hilfreichster Kommentar

Ich denke, wir haben dies tatsächlich in 16.8.2 behoben. Bitte öffnen Sie ein neues mit einem reproduzierbaren Fall, wenn nicht.

Alle 3 Kommentare

Es scheint ein Fehler zu sein, dass der Fehler beim Aussetzen ausgelöst wird. Afaik, das war nicht beabsichtigt.

Alles klar, gut zu wissen!

Vielleicht möchten Sie auch dokumentieren, dass es ein definiertes Verhalten ist, im Falle einer Unterbrechung nicht alle Hooks zu rendern. Aber ich gehe davon aus, dass dies geschehen wird, sobald die Sperrung offiziell als Datenabrufmechanismus eingeführt wird.

Ich denke, wir haben dies tatsächlich in 16.8.2 behoben. Bitte öffnen Sie ein neues mit einem reproduzierbaren Fall, wenn nicht.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen