2016-04-05 6 views
66

私は通常、Stackに関連するコードを投稿しますが、これはコミュニティの一般的な考え方についてのより多くの質問です。Reduxに反応しますか? 「文脈」の問題はどうですか?

データ/状態を管理するためにReduxをReactと共に使用することを提唱する多くの人がいるようですが、読んだり学習している間に、私は正しく見えないものを見つけました。このページの下部に

Reduxの

http://redux.js.org/docs/basics/UsageWithReact.html(ストアを渡す)、それが反応「コンテキスト」の「マジック」を使用することをお勧めします。

1つのオプションは、すべてのコンテナコンポーネントの小道具として渡すことです。ただし、コンテナをコンポーネントツリーの深いところでレンダリングするという理由だけで、プレゼンテーションコンポーネントでもストアを配線する必要があるため、面倒です。

お勧めオプションは、魔法のように、すべてのコンテナコンポーネントへのストアを利用できるようにと呼ばれる特別なリアクトReduxのコンポーネントを使用することです

...

は、コンテキストページ(https://facebook.github.io/react/docs/context.html)と反応で

反応し、それを上部に警告が表示されます。

コンテキストは高度で実験的な機能です。 APIは将来のリリースで変更される可能性があります。そして、一番下の

:明確なコードを書くときに、グローバル変数は最高の回避さ

と同じように、あなたは、ほとんどの場合、コンテキストを使用しないでください...

は渡すためにコンテキストを使用しないでください。あなたのモデルデータをコンポーネントを通して。ツリーを通して、あなたのデータをスレッディングすることは明示的に理解する方がはるかに簡単です...

そう...

Reduxのは、むしろ 'を介して、各コンポーネントにダウンに沿ってstoreを渡すよりも、リアクト「コンテキスト」機能を使用することをお勧めします小道具。 Reactはその反対を推奨しますが。

また、Dan Abramov(Reduxの作成者)がFacebook(Reactの創作者)のために働いているように思われます。

  • 私はこのすべてを読んでいますか?
  • この問題に関する一般的なコンセンサスは何ですか?
+6

ああ、これは素晴らしい質問です、私はに非常に興味があります他の人の意見も聞いてください!私はそれが議論の面で閉鎖されることを少し恐れている。私は本当にそれが願っていません。 – mjohnsonengr

答えて

70

コンテキストは高度な機能であり、変更される可能性があります。 React ReduxやReact Routerのようないくつかの図書館は、実験的性質にもかかわらず、その利便性を犠牲にすることがあるため、その利便性が欠点を上回る場合もあります。

ここで重要な部分は、のライブラリです。文脈がその振る舞いを変える場合、私たちは図書館の作者としてを調整する必要があります。ただし、ライブラリがコンテキストAPIを直接使用するように求めていない限り、ユーザーは変更を心配する必要はありません。

React Reduxはコンテキストを内部的に使用しますが、この事実を公開APIに公開しません。したがって、React Reduxを介してコンテキストを使用すると、コードが更新された場合の負担はReux Reduxになります。

最終的にReact Reduxは、常にストアを小道具として渡すことをサポートしているので、コンテキストを完全に回避したい場合は、その選択肢があります。しかし、私はこれが現実的ではないと言います。

TLDR:実際に何をしているのかわからない限り、直接コンテキストを使用しないでください。コンテキストに依存しているライブラリを使用することは、比較的安全です。

+1

Danはよく言った。リスクは、Reactが将来のリリースでコンテキストを完全に削除すると、既存のReduxアプリケーションを更新するためにリワークが必要になる可能性があるということです。 Reduxはこのような変更からユーザーを保護することはできません。 Facebookを利用していることを考えれば、良いことは、文脈がなくなると事前に十分な通知を受けることができるということです。 –

+5

Reactはコンテキストを削除しません。つまり、技術的には可能ですが、FB内の多数の製品に必要な理由が存在します。同等の解決策がなければ、それは消えません。しかし、正確なAPIが変更される可能性があります。 –

+5

もう一つの重要な点は、将来的にコンテキストをより少なくするよりも、よりリアクションを使用するという計画です。スタイリング、アニメーション、ジェスチャー操作などに役立つと思われます。 –

4

私は他人についてはわかりませんが、必要な店舗の小道具だけが自分のコンポーネントに渡されるように、react-reduxの接続デコレータを使用してコンポーネントをラップすることをお勧めします。 私はを消費していないので、これは意味でのコンテキストの使用を正当化します(そして、私が担当しているすべてのコードは原則として消費しません)。

コンポーネントをテストするときに、ラップされていないコンポーネントをテストします。react-reduxはそのコンポーネントで必要な小道具を通過しただけなので、テストを書くときに必要な小道具を正確に知ることができます。

私の主張は、私のコードでは単語のコンテキストを見たことがない、私はそれを消費しないので、ある程度、それは私に影響しないことです!これはFacebookの「実験的な」警告については何も言わない。もし文脈が消えれば、私はReduxが更新されるまで他の人たちと同じように釘付けになるだろう。

+0

興味深い...私は、あなたが「反応する」という意味を、「プロバイダ」と「接続」を使ってすべてのコンテキストの内容を抽象化することを見ています。私はダン・アブラモフ氏がFBになっていると思いますが、ContextがReduxを変更し、「react-redux」が更新されることを期待しています...しかし、保証はありませんし、FBの「実験的な」警告は、 –

+0

私は確かに、何かがコンテキストに起こった場合にFBが反応を遅らせることがないとすれば、オープンソースの貢献者は私よりもreduxに精通しています。もしそうでなければ、私はそれを見つけ出して自分でやります! – mjohnsonengr

+0

私はダンにTwitterを介して彼の考えを尋ねました...良い答え、同じ行に沿って... Contextを使用するライブラリを使用し、直接使用しないでください。 –

0

それは本当に簡単に反応するコンテキストにReduxの追加することができNPMモジュールは

https://github.com/jamrizzi/redux-context-provider

https://www.npmjs.com/package/redux-context-provider

import React, { Component } from 'react'; 
import ReduxContextProvider from 'redux-context-provider'; 
import createStore from './createStore'; 
import actions from './actions'; 
import Routes from './routes'; 

export default class App extends Component { 
    render() { 
    return (
     <ReduxContextProvider store={store} actions={actions}> 
     <Routes /> 
     </ReduxContextProvider> 
    ); 
    } 
} 
関連する問題