Ich habe das i18n
Übersetzungsobjekt einmal in einer Komponente initialisiert (erste Komponente, die in der App geladen wird). In allen anderen Komponenten ist dasselbe Objekt erforderlich. Ich möchte es nicht in jeder Komponente neu initialisieren. Wie ist der Weg herum? Es hilft nicht, es für den Fensterbereich verfügbar zu machen, da ich es in der render()
Methode verwenden muss.
Bitte schlagen Sie eine generische Lösung für dieses Problem vor und keine i18n-spezifische Lösung.
Redux
oderFlux
Bibliothek , die weltweit Daten oder Zustand verarbeiten kann. und Sie können es leicht durch alle Ihre Komponenten führenAntworten:
Warum versuchen Sie nicht, Context zu verwenden ? ?
Sie können eine globale Kontextvariable in jeder der übergeordneten Komponenten deklarieren. Auf diese Variable kann im gesamten Komponentenbaum zugegriffen werden
this.context.varname
. Sie müssen nurchildContextTypes
undgetChildContext
in der übergeordneten Komponente angeben und danach können Sie diese von jeder Komponente aus verwenden / ändern, indem Sie nur angebencontextTypes
.Beachten Sie dies jedoch wie in den Dokumenten erwähnt:
quelle
Jenseits der Reaktion
Möglicherweise wissen Sie nicht, dass ein Import bereits global ist . Wenn Sie ein Objekt (Singleton) exportieren, ist es als Importanweisung global zugänglich und kann auch global geändert werden .
Wenn Sie etwas global initialisieren möchten, aber sicherstellen möchten, dass es nur einmal geändert wird, können Sie diesen Singleton-Ansatz verwenden , der anfänglich veränderbare Eigenschaften aufweist. Sie können ihn jedoch
Object.freeze
nach seiner ersten Verwendung verwenden, um sicherzustellen, dass er in Ihrem Init-Szenario unveränderlich ist .dann in Ihrer init-Methode, die darauf verweist:
Das
myInitObject
wird weiterhin global sein, da es überall als Import referenziert werden kann aber eingefroren bleibt und geworfen wird, wenn jemand versucht, es zu ändern.Bei Verwendung der React-Create-App
(wonach ich eigentlich gesucht habe) In diesem Szenario können Sie globale Objekte auch sauber referenzieren, wenn Sie auf Umgebungsvariablen verweisen.
Das Erstellen einer .env- Datei im Stammverzeichnis Ihres Projekts mit darin enthaltenen Präfixvariablen
REACT_APP_
funktioniert sehr gut. Sie können innerhalb Ihres JS und JSXprocess.env.REACT_APP_SOME_VAR
nach Bedarf referenzieren UND es ist von Natur aus unveränderlich.Dadurch muss nicht
window.myVar = %REACT_APP_MY_VAR%
in HTML festgelegt werden.Weitere nützliche Details dazu finden Sie direkt auf Facebook:
https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables
quelle
Wird nicht empfohlen, aber ... Sie können componentWillMount aus Ihrer App-Klasse verwenden, um Ihre globalen Variablen hinzuzufügen ... ein bisschen wie folgt:
Betrachten Sie dies immer noch als Hack ... aber es wird Ihre Arbeit erledigen
Übrigens: componentWillMount wird vor dem Rendern einmal ausgeführt. Weitere Informationen finden Sie hier: https://reactjs.org/docs/react-component.html#mounting-componentwillmount
quelle
componentWillMount
Erstellen Sie eine Datei mit dem Namen "config.js" im Ordner ./src mit folgendem Inhalt:
Fügen Sie in Ihre Hauptdatei "index.js" diese Zeile ein:
Überall dort, wo Sie Ihr Objekt benötigen, verwenden Sie Folgendes:
quelle
Kann globale Variablen im Webpack behalten, dh in
webpack.config.js
In js Modul kann man gerne lesen
Hoffe das wird helfen.
quelle
Der beste Weg, den ich bisher gefunden habe, besteht darin, React Context zu verwenden, ihn jedoch innerhalb einer Anbieterkomponente hoher Ordnung zu isolieren .
quelle
Sie können Mixins in Reaktion https://facebook.github.io/react/docs/reusable-components.html#mixins verwenden .
quelle
Hier ist ein moderner Ansatz, den
globalThis
wir für unsere React Native- App verwendet haben.globalThis
ist jetzt enthalten in ...appGlobals.ts
App.tsx ( unsere Haupteinstiegspunktdatei )
anyWhereElseInTheApp.tsx
quelle
Ich weiß nicht, was sie mit diesem "React Context" -Stoff sagen wollen - sie sprechen mit mir Griechisch, aber so habe ich es gemacht:
Übertragen von Werten zwischen Funktionen auf derselben Seite
Binden Sie in Ihrem Konstruktor Ihren Setter:
Deklarieren Sie dann eine Funktion direkt unter Ihrem Konstruktor:
Wenn Sie es einstellen möchten, rufen Sie an
this.setSomeVariable("some value");
(Vielleicht können Sie sogar damit durchkommen
this.state.myProperty = "some value";
)Wenn Sie es bekommen möchten, rufen Sie an
var myProp = this.state.myProperty;
Verwenden
alert(myProp);
sollte Ihnen gebensome value
.Zusätzliche Gerüstmethode zum Übertragen von Werten über Seiten / Komponenten hinweg
Sie können
this
(technischthis.stores
) ein Modell zuweisen , um es dann zu referenzierenthis.state
:Speichern Sie diese in einen Ordner namens
stores
alsyourForm.jsx
.Dann können Sie dies auf einer anderen Seite tun:
Wenn Sie eine
this.state.someGlobalVariable
andere Komponente mit einer Funktion wie der folgenden eingestellt haben:dass Sie im Konstruktor binden mit:
Der Wert in
propertyTextToAdd
wirdSomePage
mit dem oben gezeigten Code angezeigt.quelle