2015-12-18 4 views
37

Ich initialisierte i18n Übersetzungsobjekt einmal in einer Komponente (erste Komponente, die in der App geladen wird). Das gleiche Objekt wird in allen anderen Komponenten benötigt. Ich möchte es nicht in jeder Komponente neu initialisieren. Wie läuft es? Es für den Fensterbereich verfügbar zu machen, hilft nicht, da ich es in render() Methode verwenden muss.Wie deklariert man eine globale Variable in React?

Bitte schlagen Sie eine generische Lösung für dieses Problem vor und nicht eine spezielle Lösung.

+0

Sie können die 'Redux'- oder' Flux'-Bibliothek verwenden, die Daten oder Zustände global verarbeiten kann.und Sie können es leicht durch alle Ihre Komponenten passieren – vistajess

+0

Irgendein anderer Weg? Wir haben das Projekt ohne React Framework gestartet, weil es React war. Die Verbindung aller Komponenten mit dem Redux-Shop erfordert große Anstrengungen. – sapy

+2

Würde etwas wie [react-global] (https://github.com/captivationsoftware/react-global) für Sie arbeiten? – TwoStraws

Antwort

14

Warum versuchen Sie nicht Context?

Sie können eine globale Kontextvariable in einer der übergeordneten Komponenten deklarieren, und diese Variable ist im Komponentenbaum über this.context.varname zugänglich. Sie müssen nur childContextTypes und getChildContext in der übergeordneten Komponente angeben und danach können Sie dieses aus jeder Komponente verwenden/ändern, indem Sie einfach contextTypes in der untergeordneten Komponente angeben.

Allerdings nehmen Sie bitte eine Notiz von diesem wie in docs erwähnt:

Gerade als globale Variablen am besten vermieden werden, wenn klaren Code zu schreiben, sollten Sie in den meisten Fällen unter Verwendung von Kontext vermeiden. Insbesondere sollten Sie es sich zweimal überlegen, bevor Sie es verwenden, um "Tipparbeit zu sparen" und es zu verwenden, anstatt explizite Requisiten zu übergeben.

+9

schließen. aber die gesamte Komponente hat keine übergeordnete untergeordnete Beziehung und der Kontext funktioniert nicht über diesen Baum hinaus. Ich möchte i18n über die Anwendung. – sapy

+0

@sapy das ist, warum Sie i18n als Redux-Zustand nicht als eine Kontextvariable verwenden sollten, sehen Sie meine Antwort hier: http://stackoverflow.com/questions/33413880/react-redux-and-multilingual-internationalization-apps-architecture/43733280 # 43733280 –

3
+3

Hinweis: Wenn Sie die ES6-Syntax (die jetzt empfohlen wird) oder reine Komponenten verwenden, sind Mixins nicht verfügbar. Die Empfehlung ist, Ihre Komponenten zu komponieren. https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.cnpc9396o – Aren

+1

das scheint eine gute Idee, denn dann können Sie Ihre Logik zentralisieren und später zu Flux bewegen andere Speicherarten (zB Localstorage oder clientseitige DB) – dcsan

15

wird nicht empfohlen, aber .... Sie componentWillMount von Ihrer App-Klasse verwenden, können Sie Ihre globalen Variablen durch sie ... ein bisschen wie so hinzuzufügen:

componentWillMount: function() { 
    window.MyVars = { 
     ajax: require('../helpers/ajax.jsx'), 
     utils: require('../helpers/utils.jsx') 
    }; 
} 

noch halten dies für ein Hack ... aber es wird erhalten Ihre Arbeit

getan

btw componentWillMount einmal ausgeführt, bevor Rendering, sehen sie hier mehr: https://facebook.github.io/react/docs/component-specs.html#mounting-componentwillmount

+0

Es ist ein Hack für bestimmte Anwendungsfälle. Ich integriere eine React-App in den Kontext einer anderen Nicht-React-App in meinem Unternehmen. Dies scheint eine gute Möglichkeit zu sein, öffentliche Methoden für die App zu veröffentlichen. Liege ich falsch? Gibt es einen besseren Weg? – mccambridge

0

Ich weiß nicht, was sie mit diesen „React Context“ Sachen sagen wollen - sie sprechen Griechisch, zu mir, aber hier ist, wie ich es tat:

In Ihrem Konstruktor, binden Sie Ihre setzer:

this.setSomeVariable = this.setSomeVariable.bind(this); 

dann eine Funktion direkt unter Ihrem Konstruktor deklarieren:

setSomeVariable(propertyTextToAdd) { 
    this.setState({ 
     myProperty: propertyTextToAdd 
    }); 
} 

Wenn Sie es einrichten möchten, rufen this.setSomeVariable("some value");

(Man könnte sogar in der Lage sein, mit this.state.myProperty = "some value"; wegzukommen)

Wenn Sie es möchten, rufen Sie var myProp = this.state.myProperty;

alert(myProp); benutzen, sollten Sie some value geben.

Verwandte Themen