2015-12-18 73 views
37

i18n翻訳オブジェクトをコンポーネント(アプリケーションに読み込まれる最初のコンポーネント)で一度初期化しました。他のすべてのコンポーネントでは、同じオブジェクトが必要です。私はすべてのコンポーネントで再初期化したくありません。周りには何がありますか?私がrender()メソッドでそれを使用する必要があるので、ウィンドウスコープで利用できるようにすることは役に立ちません。Reactでグローバル変数を宣言する方法は?

これらの問題の一般的な解決策をお勧めします.i18n固有の解決策ではありません。

+0

データまたは状態をグローバルに処理できる 'Redux'または' Flux'ライブラリを使用できます。すべてのコンポーネントを簡単に渡すことができます – vistajess

+0

他の方法はありますか?我々は、Reactの初期の日であったため、React Frameworkがなくてもプロジェクトを開始しました。すべてのコンポーネントをReduxストアに接続するには、膨大な労力が必要です。 – sapy

+2

[react-global](https://github.com/captivationsoftware/react-global)のようなものはあなたのために働くでしょうか? – TwoStraws

答えて

14

Contextを試してみませんか?

いずれの親コンポーネントでもグローバルコンテキスト変数を宣言できます。この変数は、コンポーネントツリー全体でthis.context.varnameでアクセス可能です。親コンポーネントにはchildContextTypesgetChildContextを指定する必要があります。その後、子コンポーネントにcontextTypesと指定するだけで、どのコンポーネントからでもこの変更を使用/変更できます。

ただし、ドキュメントで述べたように、このメモを取ってください。

明確なコードを書くときに、グローバル変数は最高の回避されているのと同じように

、あなたは、ほとんどの場合、コンテキストを使用しないでください。具体的には、「入力を保存する」と明示的な小道具を渡す代わりにそれを使用する前に、2度考えてください。

+9

が閉じます。すべてのコンポーネントは親の子関係を持たず、コンテキストはそのツリーを越えて機能しません。私はアプリケーション全体でi18nしたいです。 – sapy

+0

@sapyこれは、あなたがコンテキスト変数としてではなく、還元状態としてi18nを使用すべき理由です。ここで私の答えを見てください:http://stackoverflow.com/questions/33413880/react-redux-and-multilingual-internationalization-apps-architecture/43733280 #43733280 –

3

反応でミックスインを使用できます。https://facebook.github.io/react/docs/reusable-components.html#mixins

+3

注:ES6構文(現在推奨されている)または純粋なコンポーネントを使用している場合、mixinは使用できません。 reccomendationはあなたのコンポーネントを構成することです。 https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.cnpc9396o – Aren

+1

これはあなたのロジックを一元化し、後でFlux他のタイプのストレージ(ローカルストレージやクライアントサイドDBなど) – dcsan

15

は、あなたのグローバル変数は、それを谷...少しそうのように追加するには、アプリのクラスからcomponentWillMountを使用することができます....お勧めしていないが:

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

はまだこのハックを検討します...それはあなたの仕事は

を成し遂げるだろうところでcomponentWillMountはもっとここを参照してください、レンダリングの前に一度だけ実行される: https://facebook.github.io/react/docs/component-specs.html#mounting-componentwillmount

+0

特定のユースケースのハックです。私はReactアプリケーションを私の会社の別の非Reactアプリケーションのコンテキストに統合しています。これは、消費アプリのパブリックメソッドを公開するための素晴らしい方法のようです。私が間違っている?より良い方法がありますか? – mccambridge

0

私は彼らがこの「コンテキストに反応」ものと言おうとしているかわからない - 彼らは私に、ギリシャを話しているが、ここで私はそれをやった方法は次のとおりです。

あなたのコンストラクタでは、あなたをバインドセッター:

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

それからちょうどあなたのコンストラクタの下の関数を宣言します。

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

あなたがそれを設定したい場合は、this.setSomeVariable("some value");

を呼び出します

(あなたもthis.state.myProperty = "some value";で逃げることができるかもしれません)

あなたはそれを取得したい場合は、あなたにsome valueを与える必要がありますalert(myProp);を使用してvar myProp = this.state.myProperty;

を呼び出します。

関連する問題