Mit Redux reagieren? Was ist mit dem Kontextproblem?


88

Normalerweise poste ich Sachen, die mit Code zusammenhängen, auf Stack, aber dies ist eher eine Frage zu den allgemeinen Gedanken der Community.

Es scheint eine Menge Leute zu geben, die die Verwendung von Redux mit React zum Verwalten von Daten / Status befürworten, aber beim Lesen und Lernen von beiden bin ich auf etwas gestoßen, das nicht ganz richtig aussieht.

Redux

Am Ende dieser Seite: http://redux.js.org/docs/basics/UsageWithReact.html (Passing the Store) wird die Verwendung der "Magie" von React 'Context' empfohlen.

Eine Möglichkeit wäre, es als Requisite an jede Containerkomponente weiterzugeben. Es wird jedoch mühsam, da Sie das Speichern selbst durch Präsentationskomponenten verdrahten müssen, nur weil sie zufällig einen Container tief im Komponentenbaum rendern.

Wir empfehlen die Verwendung einer speziellen React Redux-Komponente, die aufgerufen wird, um den Speicher auf magische Weise für alle Containerkomponenten verfügbar zu machen ...

Reagieren

Auf der Seite "Kontext reagieren" ( https://facebook.github.io/react/docs/context.html ) wird oben eine Warnung angezeigt:

Der Kontext ist eine erweiterte und experimentelle Funktion. Die API wird sich wahrscheinlich in zukünftigen Versionen ändern.

Dann unten:

So wie globale Variablen beim Schreiben von klarem Code am besten vermieden werden, sollten Sie in den meisten Fällen die Verwendung von Kontext vermeiden ...

Verwenden Sie keinen Kontext, um Ihre Modelldaten durch Komponenten zu übertragen. Das explizite Durchführen Ihrer Daten durch den Baum ist viel einfacher zu verstehen ...

So...

Redux empfiehlt, die Funktion "Kontext reagieren" zu verwenden, anstatt sie storeüber "Requisiten" an jede Komponente weiterzugeben. Während React das Gegenteil empfiehlt.

Außerdem scheint Dan Abramov (der Schöpfer von Redux) jetzt für Facebook (den Schöpfer von React) zu arbeiten, nur um mich mehr zu verwirren.

  • Lese ich das alles richtig ..?
  • Was ist der allgemeine aktuelle Konsens zu diesem Thema?

8
Ahh das ist eine großartige Frage, ich bin sehr neugierig, auch die Standpunkte anderer zu hören! Ich habe etwas Angst, dass es aufgrund des Diskussionsaspekts geschlossen wird. Ich hoffe es wirklich nicht.
mjohnsonengr

Antworten:


87

Der Kontext ist eine erweiterte Funktion und kann sich ändern. In einigen Fällen überwiegen die Annehmlichkeiten die Nachteile, sodass sich einige Bibliotheken wie React Redux und React Router trotz des experimentellen Charakters darauf verlassen.

Der wichtige Teil hier sind die Wortbibliotheken . Wenn der Kontext sein Verhalten ändert, müssen wir als Bibliotheksautoren Anpassungen vornehmen . Solange die Bibliothek Sie jedoch nicht auffordert, die Kontext-API direkt zu verwenden, sollten Sie sich als Benutzer keine Gedanken über Änderungen daran machen müssen.

React Redux verwendet den Kontext intern, macht diese Tatsache jedoch in der öffentlichen API nicht sichtbar. Sie sollten sich also viel sicherer fühlen, wenn Sie den Kontext über React Redux verwenden, als direkt, denn wenn er sich ändert, liegt die Last der Aktualisierung des Codes bei React Redux und nicht bei Ihnen.

Letztendlich unterstützt React Redux immer noch das Weitergeben von Speichern als Requisite. Wenn Sie also den Kontext vollständig vermeiden möchten, haben Sie diese Wahl. Ich würde jedoch sagen, dass dies unpraktisch ist.

TLDR: Vermeiden Sie es, den Kontext direkt zu verwenden, es sei denn, Sie wissen wirklich, was Sie tun. Die Verwendung einer Bibliothek, die sich intern auf den Kontext stützt, ist relativ sicher.


1
Gut gesagt, Dan. Das Risiko besteht darin, dass, wenn React den Kontext in einer zukünftigen Version vollständig entfernt, wahrscheinlich Nacharbeiten erforderlich sind, um eine vorhandene Redux-App zu aktualisieren. Es ist unwahrscheinlich, dass Redux Benutzer vor einer solchen Änderung schützen kann. Angesichts der Tatsache, dass Sie jetzt bei Facebook sind, ist die gute Nachricht, dass Sie voraussichtlich rechtzeitig informiert werden, falls der Kontext jemals verschwindet.
Cory House

6
React entfernt den Kontext nicht. Ich meine, es ist technisch möglich, aber der ganze Grund, warum es existiert, ist, dass zahlreiche Produkte in FB es brauchten. Wenn es also keine gleichwertige Lösung gibt, wird sie nicht verschwinden. Die genaue API kann sich jedoch ändern, wovor wir Benutzer schützen.
Dan Abramov

5
Ein weiterer wichtiger Hinweis ist, dass React plant, den Kontext in Zukunft mehr als weniger zu verwenden. Wir denken, es könnte sich als nützlich für Styling, Animationen, Gestenbehandlung usw. erweisen
Dan Abramov

Es ist jedoch interessant festzustellen, dass Bibliotheken mit React-Komponenten (z. B. Material-ui) natürlich nicht Teil Ihres Anwendungsstatusmodells sind, aber dennoch ein Baum von React-Komponenten mit denselben Anforderungen von Aufrechterhaltung des eigenen Zustandsmodells und Datenflusses getrennt von der Hauptanwendung. Daher nutzen sie die Kontextfunktion als einziges Mittel (für sie), um Daten an ihr Kind weiterzugeben.
Stephenwil

1
@ DanAbramov was ist mit der neuen Kontext-API? Wird die Verwendung immer noch nicht empfohlen?
Stanislav Mayorov

4

Ich weiß nichts über andere, aber ich bevorzuge es, den Connect Decorator von React-Redux zu verwenden, um meine Komponenten so zu verpacken, dass nur die Requisiten aus dem Geschäft, die ich benötige, in meine Komponente übertragen werden. Dies rechtfertigt die Verwendung von Kontext in gewissem Sinne, weil ich ihn nicht konsumiere (und ich weiß, dass jeder Code, für den ich verantwortlich bin, ihn in der Regel nicht konsumiert).

Wenn ich meine Komponenten teste, teste ich die nicht verpackte Komponente. Da React-Redux nur die Requisiten bestanden hat, die ich für diese Komponente benötigt habe, weiß ich jetzt genau, welche Requisiten ich beim Schreiben der Tests benötige.

Ich nehme an, der Punkt ist, ich sehe das Wort Kontext nie in meinem Code, ich konsumiere es nicht, also betrifft es mich bis zu einem gewissen Grad nicht! Dies sagt nichts über die "experimentelle" Warnung von Facebook aus. Wenn der Kontext verschwunden wäre, wäre ich genauso durcheinander wie alle anderen, bis Redux aktualisiert wurde.


Interessant ... Ich verstehe, was du mit 'React-Redux' meinst, wenn du all das Context-Zeug verwendest Providerund connectabstrahierst. Ich denke, wenn Dan Abramov jetzt bei FB ist, würden Sie hoffen, dass bei einer Änderung des Kontextes Redux und 'React-Redux' aktualisiert werden ... Aber es gibt keine Garantien, und die "experimentelle" Warnung von FB ist immer noch für alle sichtbar.
Stephen am

Ich habe sicherlich die Hoffnung, dass ein Open-Source-Mitarbeiter, der mit Redux besser vertraut ist als ich, wenn FB den React-Redux nicht in der Schleife hält, falls etwas mit dem Kontext passiert. wenn nicht, werde ich es herausfinden und es selbst tun!
mjohnsonengr

Ich habe Dan über Twitter nach seinen Gedanken gefragt ... Gute Antwort in die gleiche Richtung ... Verwenden Sie die Bibliothek, die den Kontext verwendet, und verwenden Sie sie nicht direkt.
Stephen am

1

Es gibt ein npm-Modul, das es wirklich einfach macht, dem Reaktionskontext Redux hinzuzufügen

https://github.com/jamrizzi/redux-context-provider

https://www.npmjs.com/package/redux-context-provider

import React, { Component } from 'react';
import ReduxContextProvider from 'redux-context-provider';
import createStore from './createStore';
import actions from './actions';
import Routes from './routes';

export default class App extends Component {
  render() {
    return (
      <ReduxContextProvider store={store} actions={actions}>
        <Routes />
      </ReduxContextProvider>
    );
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.