2016-11-10 14 views
1

私は、アプリケーションステータスで何らかの種類の日付を追跡する減速機を持っています。デフォルトでは、現在の日付で、moment.jsライブラリから取得されます。うまく動作しますが、今、私はすべての日付を特定のロケールになりたいRedux:還元剤のグローバルコンフィグレーション

const selectedDateReducer = (state = moment(), action) => { 
    switch (action.type) { 
    case 'SET_DATE': 
     return action.date; 
    default: 
     return state; 
    } 
} 

const selectedDateReducer = (state = moment().locale(globalLocale), action) => { 
    switch (action.type) { 
    case 'SET_DATE': 
     return action.date; 
    default: 
     return state; 
    } 
} 
私はまた私のリアクトコンポーネントで同じロケールを必要とするので、私はそれが好き合格

<Component locale={globalLocale}></Component> 

ハードコーディングする必要はありません。

グローバル変数も、テスト中に再定義するのが難しいため、うまく機能しません。

状態の開始に含まれていない場合は、アクションの一部として渡すことができますが、私のレデューサー初期化コードにはglobalLocaleが必要です。

おそらく、この特定の状況では、私はロケールロジックを他の場所に移すことができましたが、私は何らかの一般的なパターンにほとんど関心があります。

答えて

0

モジュールを作成するだけです。

export const globalLocale = 'en'; 

これをインポートするだけで、どこからでも使用できます。あるいは、いつでも変更することができるように関数を作成することができます。しかし、これは状態になるので、Reduxの中に入れなければなりません。唯一の例外は、初期化時に1回設定すると、アプリの存続期間中も一定になるためです。

let currentLocale = 'en'; 
export const globalLocale =() => currentLocale; 
export const setGlobalLocale = newLocale => currentLocale = newLocale; 

これはモジュールなので、実際はグローバルになります。これは、サーバー側のReactを使用する場合、サーバーが行うすべてのレンダリングが同じロケールで行われることを意味します。解決策はReduxだけを使用することです。

サイドノートとして:時間は、人間がそれをラベル付けする方法とは別のエンティティです。それは同時に私たちすべてのために存在します。 「今」はあなたのために、そして私と誰のためにも、地球上でも他の場所でも同じです。

これは、日付にロケールを設定することは、必ずしも良い考えではないことを意味します。一般的な日付を保存する方がよいでしょう。

また、状態は普通は単なるオブジェクトです。 momentインスタンスが必ずしもRedux状態に属しているとは限りません。私には最も理にかなって何

は、アプリは唯一の正規のReduxのを持っていたので、アプリ、グローバルになり、現在のロケールと一緒にJSON.stringifyまたはUnixタイムスタンプ((new Date()).getTime())と、シリアライズされDate(、のいずれかを格納することです状態。

その後、あなたはもちろん、momentの助けを借りて、日付とロケールを取り、現在のロケールに応じて日付をフォーマットヘルパー関数を作成し、あなたのコンポーネントや、あなたのmapStateToPropsでこの関数を使用します。

関連する問題