2016-06-27 22 views
3

私はReactアプリケーションにReduxを実装しましたが、これまでのところこれはうまくいっていますが、少し質問があります。還元状態のロケールが更新された後の反応コンポーネント

redux's stateに保存されているlocaleを変更するには、ナビゲーションバーにオプションがあります。私がそれを変更するとき、私はすべての構成要素が取引を変えるように改めて期待しています。これを行うには、私は、コードの重複の多くにつながるmapStateToProps機能...で

locale: state.locale

を指定する必要があります。

暗黙的にすべてのコンポーネントの小道具にロケールを渡す方法はありますかconnectreact-reduxで編集しましたか?

ありがとうございます!

答えて

6

Reduxは、コンポーネントが変更されない限り、コンポーネントが変更されないように、shouldComponentUpdateを実装しています。

あなたが connectpure=falseを渡すことで、このチェックを無視することができ、あなたの場合は

connect(select, undefined, undefined, { pure: false })(NavBar); 

パフォーマンス上の理由から、これは良いことだと、おそらくあなたが望むものではありません。

代わりに、私はlocaleは常にあなたのコンポーネント小道具に追加されていることを確認するカスタム接続機能の書き込みを示唆している:

const localeConnect = (select, ...connectArgs) => { 
    return connect((state, ownProps) => { 
    return { 
     ...select(state, ownProps), 
     locale: state.locale 
    }; 
    }, ...connectArgs); 
}; 

// Simply use `localeConnect` where you would normally use `connect` 
const select = (state) => ({ someState: state.someState }); 

localeConnect(select)(NavBar); // props = { someState, locale } 
+0

これはまさに私が心に留めていたものですが、connect関数を書き直す方法を見つけられませんでした...ありがとう! – Zephir77167

+0

こんにちは、あなたが私に与えたコードがownPropsを管理していますか? 私のコードのいくつかの箇所で私はlocaleConnectでconnectを置き換えましたが、ownPropsが未定義の場合があります。また、connectを再度使用してmapStateToPropsでlocaleを指定すると、動作しません。 – Zephir77167

+0

私は申し訳ありません、私は選択の前に小道具とreduxを使用していない(いくつかの必要な読書は私を埋める!)。スプレッド演算子を使用すると、最初のレンダリングでは機能したが、2番目のレンダリングでは機能しなかったようだ。私は 'state'と' ownProps'を指定してテストしましたが、これはうまくいくようです。コードを更新しました。 –

0

コードの複製を減らすために、私は通常、状態をpropsにマッピングするときに矢印関数をconnectメソッドに渡すだけで、よりきれいに見えます。残念なことに、私は、あなたのコンポーネントが複数のストア "オブジェクト"を購読できるように、それを暗黙的にする別の方法はないと思います。

export default connect((state) => ({ 
    local: state.locale 
}))(component); 
0

この問題を解決するために、あなたはあなたの親コンポーネントのContextを設定し、自分の子コンポーネントでそれを使用することができます。これは、接続されたReactコンポーネントに店舗のstatedispatch機能を提供するためにReduxが使用するものです。

親コンポーネントでは、getChildContextを実装し、各変数のPropTypeを指定します。あなたの子コンポーネントで

class Parent extends React.Component { 
    getChildContext() { 
     return { 
      test: 'foo' 
     }; 
    } 

    render() { 
     return (
      <div> 
       <Child /> 
       <Child /> 
      </div> 
     ); 
    } 

} 

Parent.childContextTypes = { 
    test: React.PropTypes.string 
}; 

this.context.testを使用し、そのPropTypeを指定します。

class Child extends React.Component { 
    render() { 
     return (
      <div> 
       <span>Child - Context: {this.context.test}</span> 
      </div> 
     ); 
    } 
} 

Child.contextTypes = { 
    test: React.PropTypes.string 
}; 

ここではdemoです。

Reuxのようなライブラリでこれを使用していますが、Reactのマニュアルにはこれは高度で実験的な機能であり、将来のリリースでは変更/削除される可能性があることに言及しておきます。私は個人的には、あなたが最初に言及したように、あなたが必要とする情報を単にmapStateToPropsに渡すのではなく、このアプローチを推奨しません。

+1

こんにちは、この答えに感謝を。私はその可能性を認識していましたが、コードの重複を伴​​い、実際に変数を各コンポーネントに明示的に渡す必要があるという事実を解決しません...とにかく感謝します! – Zephir77167

+0

私はあなたが言っていることに従っているかどうかはわかりません。投稿した例では、リアクションのコンテキスト機能を使って子コンポーネントに変数を明示的に渡す必要がないことが示されています。 Parentコンポーネントのための私の 'render'関数では、子コンポーネントは小道具なしでレンダリングされています.Parentの子が暗黙的にコンテキストにアクセスすると仮定しています。 –

+1

ええ、文脈をpropsに渡したい子コンポーネントごとに 'ChildrenComponent.contextTypes = {test:React.PropTypes.string};'と書く必要があります。これは 'mapStateToProps'で指定するのと同じです – Zephir77167

関連する問題