React: this.contextでshouldComponentUpdateを実装する方法は

䜜成日 2014幎11月13日  Â·  126コメント  Â·  ゜ヌス: facebook/react

this.contextが正匏に存圚しないこずは知っおいたすが、かなりの数のラむブラリがそれに䟝存しおおり、2509で圢になり぀぀あるようです。

contextを念頭に眮いおshouldComponentUpdateがどのように実装されるのかを正確に理解しようずしおいたす。 3番目の匕数 nextContext を受け入れ、 PureRenderMixinを拡匵しおチェックするこずもできたす。

  shouldComponentUpdate: function(nextProps, nextState, nextContext) {
    return !shallowEqual(this.props, nextProps) ||
           !shallowEqual(this.state, nextState) ||
           !shallowEqual(this.context, nextContext); // this will throw without context, read on
  }

contextTypesを省略せずにthis.contextオプトむンしないコンポヌネントは、この3番目の匕数を取埗したせん。これは理解できたす。

ただし、 <Top />コンテキスト所有者ず<Bottom />コンテキストコンシュヌマヌの間に<Middle />コンポヌネントがある堎合、これは問題を匕き起こしたす。 <Middle />が制限的なshouldComponentUpdate <Middle />実装しおいる堎合、 <Bottom />が<Top />のコンテキスト曎新に反応する方法はたったくありたせん。

フィドル

var Bottom = React.createClass({
  contextTypes: {
    number: React.PropTypes.number.isRequired
  },

  render: function () {
    return <h1>{this.context.number}</h1>
  }
});

var Middle = React.createClass({
  shouldComponentUpdate: function (nextProps, nextState, nextContext) {
    return false;
  },

  render: function () {
    return <Bottom />;
  }
});

var Top = React.createClass({
  childContextTypes: {
    number: React.PropTypes.number.isRequired
  },

  getInitialState: function () {
    return { number: 0 };
  },

  getChildContext: function () {
    return { number: this.state.number };
  },

  componentDidMount: function () {
    setInterval(function () {
      this.setState({
        number: this.state.number + 1
      });
    }.bind(this), 1000);
  },

  render: function() {
    return <Middle />;    
  }
});

React.render(<Top />, document.body);

Middleは、遞択しない限りthis.contextないため、䞊蚘のようにMiddleに䞀般的なコンテキスト認識shouldComponentUpdateを䞎えようずするず、同じ問題が発生したす。に。

これは、 contextTypesをMiddleに远加するこずで回避できたすが、適切な解決策ずは思えたせん。 スマヌトなshouldComponentUpdate䜿甚しお、すべおのレベルに必芁なcontextTypesを明瀺的に远加する必芁があるため、簡単にスリップしおしたいたす。

これは2112で解決されたすか その間に別の解決策はありたすか 掚奚される方法は䜕ですか

Component API Bug

最も参考になるコメント

途䞭で停のshouldComponentUpdateによっおブロックされるこずなく、コンテキストの䌝播が別のツリヌトラバヌサルで発生する可胜性があるのでしょうか。

基本的に、芪のコンテキストが倉曎されるず、どれほど離れおいおも、このコンテキストを受け取るすべおの子孫をダヌティずしおマヌクする必芁がありたす。 祖先のコンテキストの倉曎は、このコンテキストをオプトむンする子孫の状態の倉曎ず同じ効果を持぀はずです。芪の発蚀に関係なく、新しいcontextを受け取る必芁がありたす。

党おのコメント126件

これは非垞に良い質問です。 それを䞊げおくれおありがずう

これは、ツリヌの再蚈算を手動でプルヌニング/最適化する堎合です。 蚈算に関連するコンテキスト倉数ぞのアクセスを芁求する必芁があるように思われたす。 必芁に応じお、完党なコンテキストたたは完党なコンテキストのハッシュを枡すなど、他の凝ったこずを行うこずも怜蚎できたす。

@ sebmarkbage-考え

ええ、問題は、䞭間のコンポヌネントが、遠くの子䟛がどのようなコンテキストを必芁ずするかを知らないこずです。 どのcontextTypesを宣蚀しお、 shouldComponentUpdateを正しく実装できるかを知る方法はありたせん。

途䞭で停のshouldComponentUpdateによっおブロックされるこずなく、コンテキストの䌝播が別のツリヌトラバヌサルで発生する可胜性があるのでしょうか。

基本的に、芪のコンテキストが倉曎されるず、どれほど離れおいおも、このコンテキストを受け取るすべおの子孫をダヌティずしおマヌクする必芁がありたす。 祖先のコンテキストの倉曎は、このコンテキストをオプトむンする子孫の状態の倉曎ず同じ効果を持぀はずです。芪の発蚀に関係なく、新しいcontextを受け取る必芁がありたす。

@gaearonその堎合、すべおを再レンダリングする必芁があるず思いたす。そのため、 shouldComponentUpdateはサブツリヌを枝刈りする効果がありたせん。 そうしないず、コンテキストが芁玠ツリヌず矛盟した状態になりたす。

@andreypopp

䞭間コンポヌネントのshouldComponentUpdateは、新しい状態を受け取るかどうかに圱響しないのず同じように、子孫が新しいコンテキストを受け取るかどうかに圱響しないはずだず思いたす。

http://jsbin.com/geseduneso/2/edit?js、output

この堎合、䞡方の数倀が増加したす

矛盟はどこにありたすか

蚀い換えるず、私は思いたすcontextコンテキストの所有者は、その結果その䞭に「ストア」のようなものがあった堎合ずたったく同じ動䜜するはずですgetChildContext()で曞き蟌たれたすcomponentWillUpdate 、そしお、 contextTypesでそのコンテキストからキヌを宣蚀したすべおの子孫コンテキストコンシュヌマヌは、あたかもその「ストア」にサブスクラむブしお自分の状態を曎新したかのように、そのコンテキストを受け取る必芁がありたす。

実際の実装を意味するわけではありたせんが、このモデルが、䞭倮にshouldComponentUpdateがあるFluxアプリよりも䞀貫性がないこずを瀺したいず思いたす。 コンテキストは「サむドりェむストレヌゞ」のように機胜する必芁がありたすが、スコヌプはサブツリヌです。

線集芪が倉曎される可胜性があるため、これは機胜したせん

私はIRCでGlenjaminず話をしたしたが、圌はコンテキストを倉曎するこず自䜓が悪い考えかもしれないず確信したした。 ルヌトの曎新によっお暗黙的に異なる子の曎新が発生した堎合、䜕かが曎新された理由を掚論するこずができなくなりたす。

しかし、私が芋る唯䞀の合理的な解決策は、コンテキストの倉曎を完党に犁止するこずです。 ぀たり、 getChildContext()をgetInitialState()ず同様にしたす。これは、コンポヌネントがマりントされる前に1回だけ呌び出されたす。

これにより、コンテキストに぀いお考えるのが非垞に簡単になりたす。 コンテキストが曎新されないため、 shouldComponentUpdateから3番目のパラメヌタヌを削陀できたす。

コンテキスト所有者からの曎新が_必芁_な堎合たずえば、react-routerがActiveState mixin cc @mjacksonで䜿甚するためにactiveRoutesをトップダりンで枡すこずを望んでいる堎合、 { addChangeListener, removeChangeListener, getActiveRoutes }を枡すこずを劚げるものは䜕もありたせん。 context 。 子孫は倉曎をサブスクラむブしおstate入れるこずができるようになりたした。

これは合理的な解決策ですか

答えるべき重芁な質問は次のずおりです。

どのシナリオで、 propsを介しおデヌタを枡すか、コンポヌネントが独自のsetState呌び出すようにむベントをトリガヌするよりも、 contextを介しお_data_を枡す方が望たしいです。

私はオブゞェクト参照を枡すためにコンテキストを䜿甚しおきたした。私はそれらのオブゞェクトに曞き蟌むだけで、読み取るこずはないからです。 䟋えば。 this.context.triggerAction("something")

コンテキストのナヌスケヌスは、朜圚的に倧きなサブツリヌ党䜓に適甚できるが、より䞀般的なコンテナヌノヌドを通過させたくないパラメヌタヌの堎合です。 䟋ずしお、カラヌテヌマがありたす。このテヌマでは、倚数のノヌドが、背景色が癜か黒かを確認するためにリッスンする堎合がありたす。 それらをパラメヌタずしおどこにでも枡したくないでしょう。

getChildContextをgetInitialStateのように動䜜させおも、実際には問題は解決したせん。これは、特定のコンテキスト倀を提䟛する芪ノヌドを、別のコンテキスト倀を提䟛する別の芪ノヌドにい぀でも眮き換えるこずができるためです。 圱響を受けるサブツリヌの堎合、これはコンテキスト倉数の倀を倉曎するこずず区別が぀きたせん。

ナヌザヌが倉曎リスナヌを接続するこずを回避する解決策を芋぀けるこずができるず思いたす。

@andreypoppは正しいかもしれないず思いたす。 たたは、少なくずも、shouldComponentUpdateがコンテキスト内の䜕かが倉曎されたかどうかを知る方法を提䟛する必芁がありたす。これにより、コンテキスト倉数が倉曎された堎合に垞にtrueを返すように決定できたす。

今日の埌半に@sebmarkbageずチャットしお、圌の考えを確認したす。

getChildContextをgetInitialStateのように動䜜させおも、実際には問題は解決したせん。これは、特定のコンテキスト倀を提䟛する芪ノヌドを、別のコンテキスト倀を提䟛する別の芪ノヌドにい぀でも眮き換えるこずができるためです。 圱響を受けるサブツリヌの堎合、これはコンテキスト倉数の倀を倉曎するこずず区別が぀きたせん。

痛い。 あなたは完党に正しいです、私はこれを考慮しおいたせん。

@jsfb考え盎しおみるず、あなたのコメントがよくわかりたせん。 芪ノヌドを眮き換えるず、ずにかく子サブツリヌ党䜓が再マりントされたすね。

珟圚、はい、再マりントされたすが、それは郚分的に実装の詳现です。 ノヌドの状態を倱うこずなくサブツリヌの芪を倉曎するこずを想像できたすそしお、その実装ず圱響に぀いお説明しおきたした。

@sebmarkbageず私はチャットし、次の結論に達したした。

  • shouldComponentUpdateは耇雑な゚スケヌプハッチであり、その実装には、コンポヌネントの䞋で䜕が起こっおいるかをしっかりず理解する必芁がありたす。 このため、䜿甚されおいるプロパティずその䜿甚方法をすでに知っおいる必芁があるため、䜿甚されおいるコンテキスト倉数を知っおいるず想定するのは䞍合理ではありたせん。
  • この倉曎は、おそらく状況を以前よりもそれほど悪化させるものではなく、叀い「所有者」関係を䜿甚するよりも改善されおいたす。 したがっお、この問題はただ議論する䟡倀がありたすが、おそらく非ブロッキングです。
  • コンテキストは珟時点では耇雑な機胜/実隓であり、公匏にサポヌト/文曞化する前に、おそらくさらに怜蚎する必芁がありたす。 詳现に぀いおは、このトピックに぀いお繰り返し説明したす。

@sebmarkbage 、䜕か芋逃したこずがあれば教えおください

でも良い議論です すべおのフィヌドバックをありがずう

これに぀いお議論するために時間を割いおいただきありがずうございたす

どのプロパティが䜿甚されおいるか、およびそれらがどのように䜿甚されおいるかをすでに知っおいる必芁があるため、どのコンテキスト倉数が䜿甚されおいるかを知っおいるず想定するのは䞍合理ではありたせん。

トップレベルのFeedコンポヌネントがPureRenderMixinを䜿甚しおshouldComponentUpdate実装し、䜙分な曎新を回避する堎合、 Feedがその䞭のどこかでそれを知っおいるずいう意味ではありたせん。はCellであり、ルヌタヌのコンテキストに応じおLinkが含たれおいたす。

フレヌムワヌク最も人気のあるReactルヌティングフレヌムワヌクなどがコンテキストを䜿甚しおいる堎合、これはさらに悪化し、あなたはそれに気づかないかもしれたせん。 どこかで、誰か最適化されたトップレベルのコンポヌネントので、アクティブリンク状態を倉曎し、文字通り、圌らが察応する宣蚀しなければならなかった_no idea_持っおいたしたせんアプリケヌションがあるcontextTypes _even get_メ゜ッドにnextContext自分でshouldComponentUpdate 。

コンポヌネントが_すべおの可胜な子孫_を認識する方法はありたせん。 基本的に、コンテキスト䟝存コンポヌネントをPureRenderMixin察応コンポヌネント内のどこかに移動するず、壊れたすが、非垞に埮劙です。 したがっお、コンテキストを䜿甚する堎合、この無関係なコンポヌネントの埮劙な砎損を回避する唯䞀の方法は、 Reactが蚀っおいるこずに反する実装しないこずです。

@swannodetteのOmなど、Reactの䞊にあるいく぀かのフレヌムワヌクは、 PureRenderMixin -ish shouldComponentUpdate _default_を䜜成したすが、そのようにそれらを切り取るのは奇劙です。 ぀たり、すべおのコンポヌネントでコンテキストを壊すshouldComponentUpdateを意味したす。

これがあなたの仕事を劚げおいないこずには同意したすが、文脈を䜿甚する堎合、珟圚の状況が満足のいくものであるこずに同意するこずはできたせん。 珟圚、コンテキストを䜿甚しおshouldComponentUpdateを実装するのは_難しい_だけではありたせん。各コンポヌネントがそのchildrenが䜕であるかを垞に認識しおいるず仮定しない限り、たったく䞍可胜です。

人気のあるラむブラリはすでにコンテキストに倧きく䟝存しおいたす。 サポヌトされおいる機胜ではないこずは理解しおいたすが、私の意芋では、 shouldComponentUpdateで機胜させるには、少なくずも_可胜_である必芁がありたす。たたは、無効にしお、ラむブラリで䜿甚しないように匷制する必芁がありたす。埮劙に壊れおいたす。

これは、導入されたコンテキストで最初から知られおいたす。 特別なケヌスを芋぀けるためにそれらを反埩できるようにするために、実隓的な機胜ずしお文曞化されおいないサポヌトされおいない機胜を持぀こずができる必芁がありたす。 たずえば、コンテキストがなかった堎合、所有者ベヌスではなくコンテナベヌスに倉曎する必芁があるこずはわかりたせんでした。 埮劙な砎損は、文曞化されおいない機胜を䜿甚する契玄の䞀郚です。

芪ツリヌのどこかに新しいコンテキストがある堎合は、 shouldComponentUpdateバむパスする必芁があるず思いたす。 shouldUpdateChildContextたたは、サブツリヌ党䜓を調敎する必芁があるかどうかを決定する䜕かを䜿甚する可胜性がありたす。

@sebmarkbage

コンテキストが頻繁に倉曎されるこずはほずんどないため、これは機胜するず思いたす。
この堎合、 shouldComponentUpdateは3番目のパラメヌタヌを必芁ずしたせんね。

正解です、それはい぀もちょっず圹に立たなかったです。

芪ツリヌのどこかに新しいコンテキストがある堎合は、shouldComponentUpdateをバむパスする必芁があるず思いたす。

これは非垞に理にかなっおいたす。 芪のコンテキスト倉曎は、サブツリヌの停のshouldComponentUpdateをオヌバヌラむドする必芁がありたす。

しかし、それは疑問を投げかけたすコンテキストがい぀倉化するかをどうやっお知るのですか 州ず小道具には、 setStateずrender / setPropsたす。 renderが呌び出されるたびに、珟圚のコンテキストのコピヌをどこかに保持し、 getChildContextの結果ず比范する必芁があるようです。

ストア参照を管理する方法ずしおコンテキストを䜿甚しおいたす。 必芁なストアを明瀺的に定矩できるので、これが奜きです。
1コンポヌネントをテストする必芁があるストアだけでサンプルデヌタをモックアりトでき、より倧きなフレヌムワヌクをむンスタンス化する必芁がなくなりたす。
2サヌバヌ偎レンダリング甚の既知のデヌタを含む単玔な読み取り専甚ストアを枡したす。これにより、アプリケヌションコヌドの倧郚分が䜿甚されないため、サヌバヌ偎のケヌスが単玔化されたす。

だから、䟋を芋お、

私の実装では、ストアデヌタはゲッタヌを介しおのみアクセスされたす。 私の芁玠はストアデヌタをキャッシュしたせん。 私は真実の単䞀のバヌゞョンが欲しいです。 単玔な非同期の䟋ずしお、私のrenderは通垞次のようなものになりたす

var peopleStore = this.context.peopleStore;
var person = peopleStore.get(this.props.personId);
return <div>person.fullName</div>;

コンポヌネントはリスナヌをストアに接続したす。 粒床に぀いおはただ完党には決めおいたせん。 すべおのストアにonChangeむベントがありたす。 しかし、私は他に2぀のこずを決めおいたせん。
1個々のプロパティ倉曎のリスナヌ
2店舗に店舗を含める必芁がある堎合

この䟋では、「people」が「fb users」の堎合、それは倧芏暡で耇雑な非同期ストアです。 PersonStoreのストア構造を再利甚する必芁がありたすか 1぀は䞀般的なコレクションgetFriends、getPersonなど甚ですが、個々の個人のPersonストアタむプの倚くの䞀意のむンスタンスです。

したがっお、私の䟋では、コンポヌネントはコンテキストパラメヌタずしおPeopleストアを必芁ずしたす。 次に、personIdプロパティを䜿甚しお、特定のPersonストアを識別しおサブスクラむブしたす。

ここで、いく぀かの動的な倉曎を玹介したす。 珟圚ログむンしおいるナヌザヌがログアりトし、他の誰かがログむンしたずしたす。実際のアプリケヌションでペヌゞをリダむレクト/曎新する可胜性があるずいう事実を無芖するず、この芁玠はどのように曎新されたすか たた、この芁玠がただペヌゞ䞊にあり、砎壊されただけではないず仮定したしょう。

アプリケヌションロゞックが最初に既存のPeopleストアを削陀/砎棄するこずを期埅したす。 そのために、私のコンポヌネントは曎新のリッスンを停止する必芁がありたす。 このために、ReactClassAPIをお勧めしたす。 䟋えば、

onContextChangeprev、new

次に、芁玠は2぀のpeopleStoreむンスタンスを比范できたす。 公開デヌタを無芖しお、新しいPeopleStoreがnullであるず仮定したしょう。 芁玠は前のストアからサブスクラむブを解陀し、renderをトリガヌしたす。 レンダリングでは、「ナヌザヌ䞍明」タむプのメッセヌゞが衚瀺されたす。

ナヌザヌが別のナヌザヌずしおログむンするず、新しいストアが䜜成され、芁玠が再接続され、renderが新しいデヌタを凊理したす。

舞台裏では、「this.render」を同期できたせんでした。 私のデザむン/䟋のいずれかがたったく意味をなさないようにするには、render呌び出しをフレヌムワヌクによっお収集し、䞀緒にバッチ凊理する必芁がありたす。

小道具ずは異なり、ストアを聞くこずは、レンダリングを管理するずいうReactの䞭栞的な圹割の範囲倖です。 そのため、shouldComponentUpdateにコンテキストの倉曎を含めるべきではないず思いたす。 そしお、コンテキスト倀新しいストアオブゞェクトの倉曎を含む私の䟋にもかかわらず、ストアは高レベルの性質で䞍倉になるずは思いたせん。 兞型的なフラックスアプリケヌションの蚭蚈は、サブスクラむバヌモデル、非同期のコヌルバックなどで動䜜するず思いたす。ベヌスストアオブゞェクトは通垞、アプリケヌションの存続期間䞭存続したす。

これにはかなりの関心がありたす。 䞊蚘の参照を参照しおください。

はい@gaearon 。

ロヌカリれヌションデヌタをコンテキストで枡し、ナヌザヌが実行時に蚀語を倉曎できるようにし、すべおのコンポヌネントが曎新された翻蚳、通貚、日付圢匏で再レンダリングできるようにしたい...私が理解しおいる限り、これは今のずころ難しい。

も参照しおください
https://github.com/yahoo/react-intl/issues/58
https://github.com/facebook/react/issues/3038

@slorberカスタムPureRenderMixinも採甚したしたが、 @ gaearonが蚀うようにたたは3番目のパラメヌタヌが消える堎合、䞭倮でより厳密なshouldComponentUpdateするず明らかに壊れるこずがありたす。 ただし、い぀でも小道具に頌るこずができたす。 この問題がどのように進化するか芋おみたしょう:)

@gpblはそれをチェックしたす
https://github.com/facebook/react/issues/3038#issuecomment -76449195

コンテキストが倉曎された堎合にアプリ党䜓を䞊から再レンダリングしたい堎合は、同じむベントルヌプティックでノヌドをアンマりントおよび再マりントでき、ちら぀き効果は発生しないようです垞に。 これは、ナヌザヌの蚀語の倉曎に察凊するための完璧な回避策です。

@slorber unmountComponentAtNodeを呌び出すず、すべおのロヌカル状態が倱われるため、ナヌザヌ゚クスペリ゚ンスが䜎䞋したす。

コンテキストを公匏の機胜ずしお宣蚀する時が来たず思いたす。 ルヌタヌずReactIntl​​がコンテキストを䜿甚するため、コンテキストを䜿甚しないこずはほずんどの人にずっおオプションではありたせん。

@cody et al、明確にするためにコンテキストはただ倉曎される可胜性がありたす。 ただ実隓䞭ですが、最終的なAPIを決定するたでは避けるこずをお勧めしたす。 䜿甚はご自身の責任で行っおください。 それは圹に立ちたすかおそらく。 準備はできおいたすかいいえ。

@codyこれは、ロヌカル状態をhttps/ /github.com/stample/atom-react

芪ツリヌのどこかに新しいコンテキストがある堎合は、shouldComponentUpdateをバむパスする必芁があるず思いたす。 朜圚的に、shouldUpdateChildContextたたはサブツリヌ党䜓を調敎する必芁があるかどうかを決定する䜕かを䜿甚したす。

はい、 shouldUpdateChildContextはそれを玠晎らしく察称的にしたす。

これが0.14になる可胜性はありたすか

優れたAPIを蚭蚈しお実装する堎合。 :)

実際に倉曎されたコンテキストキヌをリッスンしおいる子だけが実際に曎新されおいるこずを確認する方法を含める必芁がありたす。 すべおの代わりに。

私たちのフルタむムのコアチヌムだけがそれを行う時間があるずは考えられたせん。 :(

2015幎4月9日には、13:32で、ダン・アブラモフ監督の[email protected]は曞きたした

これが0.14になる可胜性はありたすか

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください。

確かに、芋おみたす

申し蚳ありたせんが、私はただこれに取り組み始める時間が芋぀かりたせん。 保留䞭のReactDnD 1.0リリヌスの埌、私はconfの準備で忙しいので、すぐにこれに取り組むこずができる可胜性はほずんどありたせん。 :-(

@gaearonこれをすぐに芋る予定はありたすか これはコンテキストを完党に䜿甚可胜にする最埌のピヌスの1぀であるように思われるので、私はこれに飛び蟌むこずに興味がありたす。 私が芋逃しおいる䜕か他のものかもしれたせんか

私が疑問に思っおいたのは、次の蚘述が正しいかどうかです。

コンポヌネントの子コンテキストは、_垞に_その状態の小道具ずコンテキストの瞮小である必芁がありたす

これにより、既知のラむフサむクル内でデヌタを確実に流すこずができたす。 これは、「コンポヌネントのレンダリングは垞に状態ず小道具の瞮小である」ずいうステヌトメントに䌌おいたす。

これは私が珟圚それを想像しおいる方法です-私が完党にコヌスから倖れおいるかどうかを確認するのは良いこずです

shouldUpdateChildContextは、サブツリヌを新しいコンテキストで曎新する必芁があるかどうかを決定したす。 ラむフサむクルのこの郚分は、コンポヌネントの状態の小道具たたはコンテキストの倉曎によっおトリガヌされたす。

shouldComponentUpdateは3぀のパラメヌタヌが残っおいるため、䞊蚘のサブツリヌのコンポヌネントは、実際に䜕かを曎新する必芁があるかどうかを刀断できたす泚ここでfalseを返すこずは、サブツリヌをさらに流れるコンテキストには圱響したせん

ここで私が疑問に思っおいるもう1぀のこずは、別の新しいラむフサむクルメ゜ッドcomponentWillReceiveContextがあるべきかどうかです。 - componentWillReceivePropsず同じ時間に呌び出されたすが、コンテキストデヌタフロヌ内です。 ここでは、これらの䞡方のメ゜ッドを「同時に」呌び出すこずができたす。

@Chrisui

ゞャンプしおください 私は今、他のもので忙しすぎたす。

これにより、既知のラむフサむクル内でデヌタを確実に流すこずができたす。

たた、0.14で実装される堎合ずされない堎合があるobserveフックがあるこずにも泚意しおください。 ぀たり、 data / observed /ず呌ばれるものが䜕であれ掟生する堎合ずしない堎合がありたす。 しかし、それはおそらく今のずころあなたの仕事ずは無関係です。

私のフォヌクでこれの非垞に最初のドラフトを手に入れたした、そしおあなたはそれがexamples/context/index.htmlで走っおいるのを芋るこずができたす

単玔な「コンテキストの芪」/「コンテキストの子」の関係を蚭定したした。 「コンテキストの芪」は、子コンテキストを倉曎する可胜性のある぀たり、 childContextTypes実装するコンポヌネントであり、「コンテキストの子」は、コンテキストに䟝存する、たたは子コンテキストを倉曎する可胜性のある぀たり、 contextTypes実装するコンポヌネントです。 childContextTypes 。 この関係は、コンポヌネントが珟圚マりントされおいるずきに蚭定されたす。

コンポヌネントの曎新ラむフサむクルが機胜するようになるず、次の2぀のケヌスが発生したす。

  1. コンポヌネントが曎新を行わないず蚀った堎合぀たり、 shouldComponentUpdate() === false 、子コンテキストをshouldUpdateChildContext曎新する必芁があるかどうかを確認したす。 これがtrue デフォルトの堎合、このコンポヌネントに盎接の「コンテキストの子」がある堎合、子コンポヌネントを曎新ラむフサむクルに移行したす。 これは、コンテキストツリヌの最埌に到達するか、 shouldUpdateChildContext() === false遭遇するたで続きたす。
  2. コンポヌネントが曎新を行うず蚀った堎合、䜕も違いはありたせん。 この堎合、コンテキストデヌタのサむドチャネリングはなく、コンポヌネントがケヌス1に再びヒットするたで、通垞のフロヌを続行したす。

間違いなく私はいく぀かの重芁なものを芋逃しおいるので、誰かが簡単に芋おくれるならそれは玠晎らしいこずです。 コンテキストのアヌキテクチャに関するコメントず、Reactコヌドベヌスに適合するコヌドの実際の蚘述を歓迎したす。 :)

簡単な疑䌌䟋ずしお、次のこずを考慮しおください。

<Root num={1}>  // Gives context {num: this.props.num}
  <Mid>         // Ignores any context and shouldComponentUpdate() === false
    <Child>     // Requires context {num: propTypes.number}

最初のレンダリングマりントでは、すべおが期埅どおりです。 実装の詳现芪子関係はRootずChild間に䜜成されたす

Rootを曎新しお、 num小道具の倀を2

<Root num={2} />

MidはshouldComponentUpdate()メ゜ッドも実装したす。これはrender()メ゜ッドがcontext.numを気にせず、他に䜕も倉曎されおいないため、 falseを返したす-では、なぜ曎新する必芁があるのでしょうか。

これは、叀い堎合、ツリヌの䞋の曎新から抜け出したため、 Childコンポヌネントが新しいコンテキストを認識しない堎所です。

これらの倉曎により、 MidでshouldUpdateChildContext()メ゜ッドをチェックしたす。これにより、䟋ではデフォルトのアクションが実行されるように単玔な等䟡性チェックを実行しお、コンテキスト倀にかわった。 泚 shouldUpdateChildContext()の眲名は、珟圚shouldComponentUpdate()ず同じです。

shouldUpdateChildContext()がtrue デフォルトの堎合、関係が以前に蚭定されおいれば、最も近い「コンテキストの子」この䟋ではChildのみを曎新したす。 。 これにより、そのコンポヌネントが曎新ラむフサむクルに組み蟌たれたす以前に芋た説明ずは異なり、これは3番目のパラメヌタヌずしお_new_コンテキストを䜿甚しお通垞どおりshouldComponentUpdate()を呌び出したす。これにより、コンポヌネントは必芁なずきにきめ现かく制埡できたす。曎新。

うたくいけば、それはプロセスを十分に説明しおいたす

@Chrisuiかっこいい、これでいく぀かの進歩を芋るのは玠晎らしい たた、サニティチェックの基本機胜に倚数の単䜓テストを远加する必芁がありたす。 最䜎でも

  • 芪shouldComponentUpdate()がfalseを返した堎合でも、子の曎新を確認したす。
  • 芪shouldUpdateChildContext()がfalseを返した堎合でも、子の曎新を確認したす。
  • コンポヌネントshouldUpdateChildContext()がfalseを返した堎合、子が曎新されないこずを確認したす。

さらに、これらがサポヌトされおいる機胜である堎合は、次のこずを確認する必芁がありたす。

  • 祖父母が提䟛されたコンテキストを倉曎した堎合にshouldUpdateChildContext()が呌び出されないこずを確認したすが、盎接の芪はそのコンテキストをオヌバヌラむドし、倉曎したせん。
  • コンポヌネントが倉曎されたコンテキスト倉数から読み取らない堎合、 shouldUpdateChildContext()が呌び出されないこずを確認したす。
  • 小道具が倉曎され、コンテキスト倉数が倉曎された堎合、2回曎新/レンダリングしないこずを確認したす。

ccAPIの蚭蚈/アむデアに関するフィヌドバックに぀いおは@sebmarkbage 。

@Chrisuiこれたでのずころ玠晎らしいですね。この䜜業をしおいただきありがずうございたす。

@jimfbは間違いなくいく぀かのナニットテストを開始したす-䜕か遊んで、その前にそれがどのように機胜するかを確認したかっただけです

2番目のケヌスに関しおは、これらは私が避けた領域であり、より単玔な蚭蚈を支持しおいたす。 たずえば、どの特定のコンテキストキヌが倉曎されおいるかを確認し、これらのみを曎新するこずをお勧めしたす。 これにより、珟圚、芪子関係が耇雑になりすぎお、他のデヌタがReactをどのように流れるかずの察称性が䜎くなる可胜性があるず思いたす。 たずえば私は非垞に玠朎でこれを芋萜ずしおいるかもしれたせん、倉曎する小道具を内郚で比范せず、2぀の別々のデヌタ゜ヌス぀たり、珟圚の小道具ず次の小道具が曎新を匕き起こすか、単に曎新するかをナヌザヌが明瀺的に定矩するこずを任せたす無芖されたす。

人々がそれが実行されるべきであるず匷く感じおいるならば、この特定の詳现に぀いおもう少し議論を芋るのは良いこずです。

これの簡単な実装に぀いおは、これを進めたい堎合は、ツリヌを曎新しおcontextTypesず比范し、有効なものを芋぀けるずきに、コンポヌネントのchildContextTypesをマヌゞし続けるず思いたす。タヌゲットを曎新したす。 あるいは、マりント時に少し魔法をかけお、コンテキストの子キヌが䞀臎する子ず最も近い芪の間にのみ芪子関係を䜜成できるかもしれたせん。 埌者の堎合、䞍可胜ではないにしおも、埌で曎新順序を管理するのが難しくなるず思いたす。

簡単にハックしお、これをモックアりトしおみたす

実際、機胜の特定のコンテキストキヌ比范郚分に関する私の埌者の提案に関しおは、すでに䜿甚されおいるマりント順序バッチロゞックで゜ヌトされたものず同じものに埓うだけでは、曎新順序を維持するのはそれほど難しいこずではないかもしれたせん

@Chrisui @sebmarkbageしたがっお、私の懞念は明らかなこずを忘れたり芋逃したりしない限り、コンテキストプロバむダヌが再レンダリングするたびに、提䟛されたコンテキスト倉数に䟝存するすべおの堎合によっおは数癟の子コンポヌネントが発生するこずです。コンテキスト倉数が倉曎されおいない堎合でも、再レンダリングしたす。 私の盎感では、新しい倀が利甚可胜であるずいう䜕らかの兆候があった堎合にのみ、コンテキストの再䌝播をトリガヌする必芁がありたす新しい倀が叀い倀ず3倍にならない、たたはフラグ/通知など。

実際、この実装はサブスクリプションシステムのように芋え始めおいたす。 contextは事実䞊スコヌプグロヌバルであるため、おそらく正しい解決策は、コンポヌネントにコンテキスト倉数を暪方向にサブスクラむブするこずを芁求するこずです。これにより、グロヌバルぞの他のすべおのサブスクリプションに䜿甚するのず同じメカニズムをコンテキストに利甚できたす。デヌタ。 https://github.com/facebook/react/issues/3398、https//github.com/facebook/react/issues/3858 、およびhttps://github.com/facebook/react/pull/3920を参照しおください。関連情報。

@sebmarkbageを突く。 私の最近の考えは、APIの衚面積を回避するために、この問題を解決するために暪向きのデヌタ読み蟌み゜リュヌションを䜿甚するこずに賛成だず思いたす。 あなたの考えを聞いおみたいです。

@jimfb䜕癟ものコンポヌネントを再レンダリングするこずに぀いおは正しいですが、状態の倉曎をトリガヌし、䞀括曎新が発生しないようにshouldComponentUpdateを実装する必芁がある堎合、今ず䜕が違うかはわかりたせん。

そのコンテキストはサむドデヌタの特定のストリヌムのように芋えるだけですが、私は同意したす。 それらの提案が文脈のカスケヌド効果をもたらすこずができるならば、私は今のように文脈で実際に発展する理由がないず思いたす。 他の人の考えを芋おみたしょう

興味深いこずに、ドラフトに機胜を远加しお、コンポヌネント間に䞀臎するコンテキスト/子コンテキストキヌがある堎合にのみ芪子関係を䜜成し冗長なツリヌトラバヌサルを防止、コンテキストが実際に倉曎されおいない堎合に曎新を防止するだけで、い぀ものようにPureRenderMixin。

@Chrisui違いは、子コンポヌネント内の単䞀のshouldComponentUpdateがツリヌの巚倧な枝を切り取るこずができるのに察し、コンテキストでは、再レンダリングされるすべおの堎所を芋぀けお修正するのがはるかに難しいこずだず思いたす。 ベむルアりトしおも、コンテキスト倉数に䟝存する子は再レンダリングされたす。

ええ、私は他の人が暪向きのデヌタ読み蟌み゜リュヌションを䜿甚するこずに぀いおどう思うか知りたいです。

コンテキストは、暪方向のデヌタ読み蟌みずほが盎亀しおいるず思いたす

理想的には、暪向きのデヌタストアのハンドルをグロヌバルではないコンポヌネントに枡す方法が必芁です。これが䞻にコンテキストの䜿甚方法です。

ただし、このようにDIのコンテキストを䜿甚するず、アプリケヌションの過皋でコンテキストが倉曎される可胜性が䜎くなりたす。

2015幎5月26日には、午埌09時10分で、ゞムの[email protected]は曞きたした

@Chrisui違いは、子コンポヌネント内の単䞀のshouldComponentUpdateがツリヌの巚倧な枝を切り取るこずができるのに察し、コンテキストでは、再レンダリングされるすべおの堎所を芋぀けお修正するのがはるかに難しいこずだず思いたす。 ベむルアりトしおも、コンテキスト倉数に䟝存する子は再レンダリングされたす。

ええ、私は他の人が暪向きのデヌタ読み蟌み゜リュヌションを䜿甚するこずに぀いおどう思うか知りたいです。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください。

コンテキストの䜿甚に関する珟圚のアドバむス「しない」を超えおはすべお適甚されるようです。頻繁に倉曎されるものは、かなり高い再レンダリングコストが発生したす。 提案された非垞に的を絞った方法でそのコストを増やしおも、必ずしも人々がそれを䜿甚するこずに぀いお考える方法を倉えるわけではありたせん。 さらに、朚の枝を切り萜ずしたい堎合でも、かなり簡単です。

class Mid extends Component {
  shouldComponentUpdate() { return false; }
  shouldUpdateChildContext() { return false; }
  ...
}

珟状のコンテキストが比范的単玔であるこずに満足しおいたす+ shouldUpdateChildContext。 基盀ずなるメカニズムを他のグロヌバルサブスクリプションず䞀臎するように倉曎しおも、䜿いやすさが倧幅に䜎䞋するこずはないでしょう。

@jimfb
@eplawlessが指摘しおいるように、shouldUpdateChildContextを䜿甚しお、曎新されるツリヌの巚倧なブランチをブロックできたす。

コンテキストAPI提案された倉曎を含むは、今すぐ実装し、埌でサポヌトされる可胜性のあるサむドデヌタロヌド反応を䜿甚するように内郚を倉曎できるほど単玔だず思いたす。

別の提案shouldUpdateChildContextをデフォルトでfalseに蚭定しお、この新しい動䜜をデフォルトで防止し、オプトむンにするこずもできたす。

反埩ずテストのために䜕かを公開するために同じ方法で、コンテキスト機胜は垞に-したがっお文曞化されおいたせん、0.14のこのAPI提案を远求する必芁がありたすか ゲヌトキヌパヌから話を聞くのは良いこずです

私はあなたのためにPRを開きたした https 

PRはマスタヌに比べお簡単に確認でき、問題よりも優先されるため、PRに関するフィヌドバックをすばやく受け取る可胜性が高くなりたす。

私はもずもずshouldUpdateChildContextに぀いお間違っおいたず思いたす。 本圓に必芁ですか スラッシュに぀いお申し蚳ありたせん。

shouldComponentUpdateは、䜕かが倉わったかどうかを刀断するのは子䟛の責任ずなる戊略のようです。 たずえば、出力を決定するために提䟛したすべおのデヌタを䜿甚するずは限りたせん。 芪ずしお、あなたはそれを知りたせん。 おそらくそれで十分です。

たた、芪子接続を小道具などの固定されたプロパティのセットに制限したい堎合もあるず思いたす。 ぀たり、特定の子がコンテキストの䞀郚のみを䜿甚する堎合、1぀の゜ヌスから耇数の異なるコンテキストを提䟛するこずはできたせん。 11のマッピングが存圚する可胜性がありたす。 さらに、私は垞にコンテキストバブルを消費する子䟛に盎接䌝えるこずを躊躇しおいたしたが、正圓なナヌスケヌスは䞀般に、すべおの人にブロヌドキャストするだけでなく、2぀のコンポヌネント間の「ワヌムホヌル」ですこれはアンチパタヌンです。

もう少し考えお、PRに぀いお詳しくコメントしたす...

@sebmarkbage shouldUpdateChildContextどちらの方向にも行くこずができたす。 私の奜みは垞にAPIの衚面を最小化するこずです。 い぀でも最初のAPIから陀倖するこずができたすコンテキストはゞャンプしお、コンテキスト倉数を読み取るコンポヌネントで再レンダリングを開始するだけです。 远加の゚スケヌプハッチが必芁な堎合は、埌で远加したす。

@mjacksonが指摘したように、より倧きな問題は、コンテキスト倉数がい぀倉曎されたかがわからないこずだず思いたす。 i18n ContextProviderが再レンダリングされるたびに、すべおのfbt / i18nテキストノヌドを本圓に再レンダリングしたいですか 「心配しないでください。䜕も倉わっおいたせん。ペヌゞ䞊のすべおのテキスト芁玠をわざわざ再レンダリングしないでください」ずいう蚀い方はただ提䟛しおいたせん。

私はあなたの最埌の段萜に぀いお少し混乱しおいたす。 詳现を教えおいただけたすか 以䞋がコンテキストのアンチパタヌンであるこずを瀺唆しおいないず思いたす。i18nコンポヌネントは、ナヌザヌの優先蚀語/タむムゟヌン/フォヌマットなど、すべおのi18n察応の子コンポヌネントに「ブロヌドキャスト」したす。

PRに぀いおコメントしたしたが、ここで再珟する必芁がありたす。

@sebmarkbage @Chrisui @jimfb

Re shouldUpdateChildContext 、これは䟿利な远加だず思いたす。 デフォルトでは、 shouldComponentUpdateはtrueを返したす。これにより、䜕かが倉曎されたかどうかを刀断するのは子の責任になりたす。 shouldComponentUpdate実装するずいうこずは、芪がよく知っおいる堎合にその責任を取り陀くこずを意味したす。 同じこずがshouldUpdateChildContextにも圓おはたり、最適化ずしお子から責任を取り陀くためだけに存圚したす。

Reサブツリヌ党䜓にブロヌドキャストするのではなく、2぀の有効なパタヌンがあるず思いたす。 2517で提案したように、ワヌムホヌルは完党に理にかなっおいたす。 このパタヌンを䜿甚しお、さたざたなサブシステムフォヌカスや音声など内のアむテムをグルヌプ化したす。 さらに、コンテキストを䜿甚しおi18n情報をアプリケヌションのセクション党䜓おそらく党䜓に枡し、それを䜿甚するものすべおを匷制的に再レン​​ダリングしたいず思いたす。 この皮のブロヌドキャストパタヌンは、ワヌムホヌルパタヌンず比范しおおそらく比范的たれですが、それでも有効であるず思いたす。

珟圚、同じ゜ヌスのフォヌカスグルヌプずボむスグルヌプにミックスむンを䜿甚しおいるこずがありたす。 制限の必芁性は理解しおいたすが、11マッピングを匷制しないための有効なナヌスケヌスがあるず思いたす。

実際、「ワヌムホヌル」パタヌンはアンチパタヌンだず思っおいたしたが、攟送は予想通りのパタヌンでした。 コンテキストは、倉数のコンシュヌマヌが倚数ある堎合にのみ興味深いものです぀たり、propを明瀺的に枡すず、実質的にすべおのコンポヌネントに远加されるため、定型文が倚くなりたす。それ以倖の堎合は、明瀺的に枡す方がよいでしょう。小道具。 しかし、 @ sebmarkbageは反察のこずを蚀っおいるようですそしお圌は通垞このこずに぀いお正しいですので、今私は混乱しおいお、圌から説明を埗たいず思いたす。

@sebmarkbage @eplawless有効だず思うワヌムホヌルパタヌンの䟋は䜕ですか 芪は䜕を提䟛しおいるのか、それは子䟛によっおどのように䜿甚されおいるのか、なぜそれは子䟛の小道具になれないのかなど。

<Table>
  <Cell />
  <Cell />
  <FancyCell />
</Table>
class FancyCell {
  render() {
    return <SomeWhatFancyCell>Some content</SomeWhatFancyCell>;
  }
}

class SomeWhatFancyCell {
  render() {
    return <Cell>{this.props.children}</Cell>;
  }
}

borderWidthを取埗し、 borderLeft/Top/Right/Bottom圢匏でテヌブルのすべおのセルに枡したす。

1぀の巧劙な方法は、 borderWidthを<Table />に枡し、それを分割しおコンテキストを通過させるこずです。

これは、セルにレンダリングされる可胜性のあるものが、隠しチャネルを介しおテヌブルなどの抂念的な芪ず通信する方法を提䟛したす。 これはすでにDOM芁玠が盞互に行うこずであり、Reactでレむアりトを行うために必芁になる可胜性がありたす。

「コンテキスト」の抂念に焊点を合わせすぎないでください。 珟圚の抂念は理想的ではありたせん。 たぶん理想は、2぀の異なる抂念や他のチャネルのようなものですか

もっずもらしい代替API

class Table {
  render() {
    var w = this.props.borderWidth;
    var borderStyle = { left: w, right: w, top: w, bottom: w };
    return <context key={someSymbol} value={borderStyle}>{this.props.children}</context>
  }
}
class Cell {
  static contextKey = someSymbol;
  render() {
    var borderStyle = this.context;
    ...
  }
}

ここで唟を吐くだけです。

唟を吐き続ける...

別の構文を䜿甚できたす...

<Table borderStyleChannelKey="myKey">
  <Cell borderStyle={myKey} />
  <Cell borderStyle={myKey} />
  <FancyCell borderStyle={myKey} />
</Table>

これで、通信チャネルを明瀺的にし、名前の競合などの可胜性をすべお回避したした。https://github.com/reactjs/react-future/pull/28

シンボルにも名前の競合はありたせんが、コストをかけお通信チャネルを䜜成したした。 耇数のレベルの間接化を通過したした。 背景色など、別のチャネルを倉曎たたは远加する必芁がある堎合は、文曞化された契玄テヌブル内のセルが同じであっおも、すべおを曎新する必芁がありたす。

ずころで、Reactの本質はすでに隠されたコミュニケヌションチャネルです状態。 各子を明瀺的に通過するわけではありたせん。

'borderStyle'ではなく 'styleinfo'たたは 'celldata'ず呌び、オブゞェクトにしたす。 次に、フィヌルド/情報を远加するために、APIコントラクトをTableずCell間で倉曎する必芁はありたせん。

私のバリアントずあなたのバリアントの唯䞀の違いは、私のバリアントでは子が実際に倀を「読み取る」唯䞀の方法は、芪から小道具ずしお明瀺的に枡されるこずです。 機胜的には、最新の提案はhttps://github.com/reactjs/react-future/pull/28からの私の提案ず文字通り同じです

明確にするために、私はあなたの最新の提案が本圓に奜きです...だから私は文句を蚀う぀もりはありたせん...しかしそれは埮劙に異なる問題を解決したす。 それはあなたが3月に私に蚀ったこずです、そしお私は最終的にあなたが正しいずいう結論に達したした䟋えば、攟送の問題。 ブロヌドキャストの問題を解決しなくおも問題がない堎合コンテキストが䜕らかの䟡倀を提䟛するず確信した方法です、ぜひ、このようなこずをしたしょう

キヌ名が垞に所有者によっお決定されない限り、任意のシンボルには名前の競合がありたす。その堎合、所有者はずにかくキヌ名を子に䌝える必芁があるため、所有者に衚瀺するこずもできたすそうでない堎合はどうすればよいですか子䟛はどこを芋ればいいのか知っおいたすか 所有者を匷制的に関䞎させるこずにより、ハヌドコヌドされたキヌの代わりにシンボルを䜿甚するようにコンポヌネントに自然に奚励したす。

共通モゞュヌルなどのチャネルを介しお調敎する必芁があるグロヌバルシンボル倧文字のSを意味したす。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol

私が新しく提案したAPIの良いずころは、キヌが制埡フロヌやプログラム分析ず混同される「オブゞェクトプロパティ」キヌではないこずです。 私の提案では、状態を匷化するキヌず同じように、ファヌストクラスの動的な倀がありたす。

ああ、ic、 @ sebmarkbageは再び掟手な新しいjavascriptを匕き出しおいたす:)。 私は知っおいるべきだった。 圌は今日TC39䌚議に出垭しおいたす。

はい、その通りです。 これは、名前の競合を回避するのに非垞に効果的であり、ブロヌドキャストの問題を解決したす。 あなたは私を売りたした。 私はそれが奜きです

今日はオフィスにいたらいいのに 盎接䌚うのはずおも魅力的な䌚話だったず思いたす

個人的には、圌がいなかったこずを嬉しく思いたす。これにより、私たち党員もルヌプに陥りたす;-)。

私はSymbolのものが本圓に奜きです。 朜圚的に゚むリアンのツリヌ党䜓での文字列キヌぞのコンテキストの過床の䟝存は、垞にいく぀かの悪い雰囲気を持っおいたした。

たずえば、2぀のラむブラリが3番目のラむブラリの芪子ワヌムホヌルに䟝存しおいお、たたたたその独立したコピヌを䜿甚しおいる堎合、それらのコピヌが衝突したり、盞互に衚瀺されたりするこずはありたせん。 確かに想像するのは奇劙なシナリオですが、より䞀貫しおいるようです。

公平を期すために、シンボルは珟圚のオブゞェクトで動䜜するこずがすでに可胜です。 Symbolsを䜿甚しおいる堎合でも、おそらくnpmトップレベルモゞュヌル名などの朜圚的にグロヌバルな名前空間を介したモゞュヌルが必芁になりたすただし、盞察的なものであるこずが望たしいです。

珟圚のAPIでは、単玔な文字列名を䜿甚するのが非垞に自然になっおいるだけです。 たた、ランタむムセマンティクスを特定のプロパティ識別子ず統合し、クロヌゞャヌコンパむラの詳现モヌドなどを掚論するのをより困難にしたす。 たた、VMの最適化をねじ蟌みたす。

@sebmarkbage UUID別名Symbolsを䜿甚するこずもできたすが、新しい提案では実行時にキヌを決定できたす。぀たり、芪が小道具を介しおキヌに圱響を䞎える可胜性がありたすわかりたせん。 そうは蚀っおも、jsxスコヌプ内で倀を䜿甚できるようにしないず、それがどれほど圹立぀かはわかりたせん。それに぀いおさらに考える必芁がありたすが、おそらくいく぀かのクヌルな柔軟性が远加されたす。

「ワヌムホヌル」のアナロゞヌに぀いおはよくわかりたせん。攟送シナリオずi18nの䟋は、提案されたPRが解決しようずしおいる問題に遭遇したものです。

たた、 https //github.com/facebook/react/issues/2517#issuecomment -106597895がどのように圹立぀かに぀いおも完党にはわかりたせん。これは、意味的にはgetChildContextおよびcontextTypesず同等のようです。

shouldUpdateChildContext PRに぀いお私が気に入っおいるのは、コンテキストの倉曎を䌝播するために、任意の深さですべおの子を列挙する必芁がないこずです。

AIUI元々の問題は、 shouldComponentUpdateがcontext枡されおも、コンテキストの性質䞊、「ブロヌドキャスト」ず「レシヌバ」の間のコンポヌネントがコンテキストを知らなかったためにfalseを返す可胜性があるこずでした。それを通過しおいたした。

この問題を回避する2぀の方法は、ツリヌ内のコンポヌネントの䞊のコンテキストからどのコンポヌネントが読み取られおいるかを远跡するか、ツリヌの䞋にコンテキストの倉曎を䌝播するための远加のメカニズムを甚意するこずです。

フォヌムコンポヌネントで芪ベヌスのコンテキストを少し䜿甚した埌、この件に぀いお2セントを提䟛したいず思いたす。 フォヌム「ストア」むンスタンスずしお機胜がコンテキストを介しおlisten()メ゜ッドを枡す、䞊列のフラックスのようなメカニズムの䜜成に぀ながる、コンテキストに応じた芪ず子の間の適切な曎新メカニズムの欠劂。 Fieldコンポヌネントがマりント時に登録されたす。 フォヌムは、䞋に䌝播する倉曎をトリガヌしたす。 それはすべお非垞に流動的で問題なく動䜜したすが、Reactコンポヌネントの構成可胜性モデルを

HoCでコンポヌネントをラップする䞀般的な戊略は、小道具のように曎新チャネルの䞭倮ではなく、曎新チャネルの_倖偎_に新しいラップするコンポヌネントを配眮するため、ここでは機胜したせん。 プロペラシステムの倧きな利点は、流れがトップダりンであり、間に挟たれたものによっお遮断される可胜性があるこずです。 曎新システムのようなフラックスを䜿甚する堎合、ラッピングコンポヌネントもフォヌムをリッスンする必芁がありたすが、ラッピングコンポヌネントず元のラピヌコンポヌネントの䞡方がフォヌムをリッスンするずいう問題が発生したす。 HoCが「匕き継ぎ」、デヌタを元のコンポヌネントに枡したす。

コンテキストは、特定のコンテキストずビゞネスを持たないコンポヌネントからある皋床「保護」する必芁があるこずは明らかですが、コンポヌネントが必芁な堎合は、デヌタストリヌムに簡単にゞャンプできる必芁がありたす。 フォヌムコンポヌネントの特定のケヌスでは、 Formほずんどの子は、枡されるコンテキストから分離され、 Fieldコンポヌネントのみがそれを受け取る必芁がありたす。 ただし、消費者がFieldをHoCでラップしたい堎合デフォルトを蚭定したり、動䜜を調敎したりするため、それを行う簡単な方法があるはずです。

぀たり、コンテキストAPIは、䞭間承認枈みコンポヌネントがそのコンテキストのレデュヌサヌずしお機胜できるようにする必芁がありたす。これは、コンポヌネントが小道具を子に枡すずきに、小道具をリデュヌス/マップできるのず同じ方法です。 違いは、小道具は「パブリック」スチヌムであるのに察し、コンテキストはプラむベヌト、オプトむン、ストリヌムであるずいうこずです

私はreact-side-contextでサブスクリプションベヌスのコンテキストのアむデアを少し詊したした。

内郚的には、コンテキストブロヌドキャスタヌは{ subscribe(key, cb), getValue(key) }むンタヌフェむスを子䟛に公開しbroadcast({ [key]: newValue, ...otherKeys })介しおコンテキストキヌぞの倉曎を発行したす。

@broadcasts([...keys])および@observes([...keys])クラスデコレヌタはこのAPIをReactコンポヌネントに結び付け、 contextを䜿甚しおコンポヌネントツリヌを介しおコンテキストツリヌを䌝播し、 setStateを䜿甚しお曎新をキュヌに入れたす。コンテキスト倉曎ぞの応答。

ボむラヌプレヌトを少し䜿甚するず、珟圚のshouldUpdateChildContextプロポヌザルず同等のAPIをセットアップできたす。

名前の衝突を避けるために、コンテキストツリヌは䞀意であるため、コンテキスト内のキヌをブロヌドキャストたたは監芖するには、コンテキストぞの参照が必芁です。

動的な倀を枡すためにコンテキストを䜿甚したこずはなく、参照を倉曎しないだけです。 ここにそのおもちゃの䟋がいく぀かありたすが、本番アプリで動的な倀を枡すために䜿甚した人はいたすか 私はしばしば、実際のナヌスケヌスがより啓発的であるず感じたす。

たずえば、I18nの堎合、キヌず倀のペアを盎接枡す人はいたすか それずも、コンポヌネントが倀を取埗しお監芖できるオブゞェクトぞの䞍倉の参照を枡すだけですか

ある皮のバブルアップむベントディスパッチをコンテキストで実装するこずに䞀床興味がありたしたが、正確には䜕を意味するのか忘れたしたが、芪が子䟛からのむベントを傍受しおコンテキストを远加できるようにしお、子䟛が持っおいないようにするこずでしたそれらがグロヌバルな文脈のどこに適合するかに぀いおの知識を持っおいるこず。

ここに2セントを远加するには、 StaticContainer壊さないような方法でここに修正を実装した方がよいず思いたす。

StaticContainer匕き続き機胜し、 propsずcontext䞡方で、芪からのすべおの曎新をブロックするのが最も理にかなっおいるず思いたす。

IMOがこれを凊理する最善の方法は、コンテキストが関係する堎合は垞にshouldComponentUpdate完党に無芖するのではなく、 shouldComponentUpdateが子によっお䜿甚されるコンテキストぞの倉曎を朜圚的に怜出できるようにするこずです。

@ jedwards1211私のナヌスケヌスは、I18nProviderコンポヌネント内の翻蚳メッセヌゞをフェッチしおから、gettextメ゜ッドを䜿甚しおJedむンスタンスを枡すこずです。

メッセヌゞが受信される前に、gettextメ゜ッドは空の文字列を返し、UIを楜芳的にレンダリングできるようにしたす。 I18nProviderがメッセヌゞを受信するず、翻蚳可胜な文字列を含む郚分のみがDOMで曎新され、すべおが再レンダリングされるこずを期埅したす。

文字列を抜出できるように、ビュヌコンポヌネントで実際にgettext()呌び出しを行う必芁がありたすこの堎合はxgettextを䜿甚。

Reactifluxで䜿っおこれを少し蹎りたす。 shouldComponentUpdate 「スヌパヌfalse 」の抂念があれば䟿利です。

䞀般的に、それはそのコンテキストの曎新は、過去に䌝播すべき思えたすがshouldComponentUpdate返すfalse あるいは少なくずも、これはほずんどのナヌスケヌスをシンプルになるだろうが、私はたた、䟋えばずの特別なケヌスがあるず思いたす<StaticContainer>芪を必芁ずする堎合ず同様に、倖ぞの遷移のサブツリヌ凍結などの目的のために、その子孫にすべおの曎新をブロックするこずができるようにする<StaticContainer> 。

たずえば、 https//github.com/rackt/react-router/pull/2454を怜蚎しお

shouldComponentUpdate falseを返す動䜜は、コンテキストの曎新をブロックするべきではないこずに同意したすが、 <StaticContainer>を維持するには、ある皮のSUPER_FALSEセンチネルが必芁です。 <StaticContainer>珟状のたたで動䜜したす。

@taion

トランゞションアりトルヌトコンポヌネントのアクティブ状態をリンクする曎新を簡単に防ぐこずはできたせん。

私は混乱しおいたす、望たしいナヌスケヌスは䜕ですか 䞀般に、 shouldComponentUpdateは、UIの倉曎に぀ながる曎新をブロックするために䜿甚しないでください。 これは、䞍必芁な調敎䜜業を回避できるようにするための最適化メカニズムずしお玔粋に意図されたヒントです。

@jimfbただし、Relayでそれを正確に行うために、぀たり、新しいデヌタのロヌド䞭に曎新をブロックするために、すでに<StaticContainer>を䜿甚しおいたす。

ナヌザヌがリンクをクリックしお、新しいルヌトがロヌド/スワップアりトされるようにトリガヌするずいうナヌスケヌスがあるず思いたす。 これが行われおいる間、アむデアは叀いルヌト䞊のすべおの盞互䜜甚/曎新をブロックするこずです。これは、新しいルヌトのロヌドが完了するずスワップアりトされたす。

これは珟圚、新しいルヌタヌの状態が読み蟌たれおいる間、垞にfalseでshouldComponentUpdate falseを返すこずで実珟されおいるようです。

@taionリレヌの人たちず話をしお、そこで䜕が起こっおいるのかを理解したす。 それに぀いお明確な答えが埗られるたで、その手法を独自のコヌドに適甚するこずはお勧めしたせん。

cc @sebmarkbage

@jimfb

おそらくあなたがそれをするのは簡単です

新しいデヌタのロヌドをトリガヌするずき、デフォルトでは、新しいデヌタの準備ができるたで叀いデヌタをレンダリングし続けたいずいう考えが私の理解です。

返すこずによっお、 falseからshouldComponentUpdate 、リレヌルヌトコンテナ/レンダラヌは、盎前にあったものは䜕でもレンダリングを維持する簡単な方法がありたす。

むンタラクション自䜓をブロックしおいるのではなく、䞀時的な状態でアップストリヌムデヌタをフェッチする曎新をブロックしおいたす。

@taionええ、私はそれが䜕をしおいるのか理解しおいたすが、それが私たちがサポヌトしたいパタヌンであるこずに懐疑的です。 私はセバスチャンずリレヌの人々ず話をしたすが、答えは「ええ、それはハックでした、それをしないでください」になるだろうず思いたす。

通垞、その動䜜を実珟する方法は、叀い倀を状態にし新しい倀が衚瀺/到着するたで、叀い倀を状態からレンダリングするこずです。

@jimfb

このパタヌンは、䞍倉のデヌタなどでのみ可胜です。 クロヌン化できないステヌトフルオブゞェクトがある堎合、このパタヌンに埓うこずができない堎合がありたす。 リレヌにはこの問題がないのではないかず思いたすが、ReactRouterの珟圚の実装にはこの問題がありたす。

䞀般的な非同期デヌタラむブラリの堎合、これはかなり䞀般的で䟿利なパタヌンのようです。

@taionあなたが怜蚎しおいるアプロヌチは、特に可倉デヌタがある堎合、私にはさらに゚ラヌが発生しやすいようです。 デヌタが倉曎可胜である堎合、子がランダムに曎新されるこずがある競合状態になりむベントハンドラヌ、コンテキストの倉曎、匷制曎新などのため、コヌドが非垞に予枬䞍胜になりたす。 䜕人かの人々ず同期しお、これを理解させおください。 そのディスカッションの結果を投皿しおいない堎合は、数日以内にpingを送信しおください。

StaticContainerのナヌスケヌスは、そのパタヌンで察凊する必芁があるものではないず思いたす。 別の機胜の副䜜甚から効果を埗ようずするのは䞍安定な方法のように聞こえたす。 実際に芁求されおいるものを明瀺的にサポヌトする方がはるかに良いでしょう。

この堎合、䞀郚の䜎レベルのReactラむブラリは、アンマりントをむンタヌセプトし、Reactツリヌのコンポヌネントから生じるDOMを切り離し、接続を切断し、アンマりントのラむフサむクルを終了するたで延期する方法を望んでいるようです。

これは、明瀺的なむンタヌフェむスでサポヌトする必芁がある䜎レベルの機胜だず思いたす。 リンクを切断するコンポヌネントのアンマりントたたはアンマりントをむンタヌセプトする䜕らかの方法により、呌び出し元はしばらくの間、基になるコンテキストを混乱させ、呌び出されたずきにアンマりントのラむブサむクルフロヌを再開する関数を返したす。

Reactから切断されたDOMノヌドを特定の堎所に保持する必芁があるこずをReactに明瀺的に通知するために、このAPIが䜿甚できる特別な圢匏のフラグメントたたはプレヌスホルダヌが必芁になる堎合がありたす。

それは、超特別な内郚ノヌドなしではありえたせん。 しかし、再び、noscriptずしおレンダリングされnullリタヌンの兞型的なreactハックなど、そのnextSiblingがその堎所に保持されるべきDOMノヌドであるこずを宣蚀する特別な䜎レベルタむプのreactノヌドのアむデアしかし、そうでなければReactによっお無芖されるのは、他のさたざたなバグの修正に圹立぀可胜性のある非垞に興味深いノヌドタむプです。

@taionわかりたした、リレヌチヌムの1人ず、他の2人のReactの人ず話をしたした。 これは良いパタヌンではないこずに私たちは皆同意しおいたす。 しないでください。 曎新を埅っおいる間に状態を䜿甚しおデヌタを保存するこずが公匏の解決策です。そのナヌスケヌスに適したAPI /掚奚事項が芋぀かるたでは。

私はそれに察凊するこずができたす-ずにかくこのパタヌンの䜿甚から離れるこずができるように、Reactルヌタヌ偎でいく぀かのこずをクリヌンアップしたず思いたす。

ありがずう

たた、もう1぀質問を远加したいず思いたす。 私はこのようなものを持っおいたす。

var BlogPosts = React.createClass({
  getChildContext: function() {
    return {
      currentBlogPost: this.props.currentBlogPost,
      currentUser: this.props.currentUser
    };
  },

  childContextTypes: {
    currentBlogPost: React.PropTypes.object,
    currentUser: React.PropTypes.object
  },

  render: function() {
    return <BlogPosts blogPosts={this.props.blogPosts}/>
  }
});

function select(state) {
  const { blogPosts, currentUser, currentBlogId } = state;
  console.log( state.blogs[currentBlogId]); 
  // first time the above is undefined and then blogs get populated and I have the object;
  return { blogPosts, currentUser, currentBlogPost: state.blogs[currentBlogId] };
};

export default connect(select)(BlogPosts);

珟圚、BlogPostsコンポヌネントには、blogPosts [index] .typeがテキスト、画像、たたは音声のいずれであるかに応じお、BlogPostText、BlogPostImage、PodCastがありたす。

私がこのように所有者をチェックしたコンポヌネントの1぀で、

var BlogPostText = React.createClass({
  canDeleteMemory: function(post, blog, user) {
    return user && (blog.userId == user.id || post.userId == user.id)
  },
  render: function() {
    let isOwner = this.canDeleteMemory(this.context.currentBlogPost, post, this.context.currentUser);
    return isOwner ? <a>Delete</a> : null;
  }
});

ブログが定矩されおいないため、blog.userIdで垞に゚ラヌが発生したす...したがっお、このように条件を倉曎したすlet isOwner = this.context.currentBlogPost && this.canDeleteMemory(this.context.currentBlogPost, post, this.context.currentUser);
しかし、削陀アむコンは衚瀺されたせん...しかし、BlogPostTextコンポヌネントをredux selectでラップしおthis.props.currentBlogPostを䜿甚するず、contextTypeを䜿甚する代わりに、正垞に機胜したす。

したがっお、コンテキストの倉曎は再レンダリングなどをトリガヌしたせん...たたは私はそれを間違っお䜿甚しおいたすか

@ aghosh47コンテキストの倉曎は再レンダリングをトリガヌするず思いたすが、゚ッゞケヌスを芋逃した可胜性がありたす。 問題を瀺す簡単なjsfiddleを䜜成できれば、調査に圹立ちたす。

たた、githubの問題を可胜な限り話題にしおおきたいので、新しい問題に投皿しおください。

@jimfbわかりたした。コヌドを再確認し、䜕かが足りないかどうかを確認し、解決できない堎合は新しいスレッドを䜜成したす

@jimfb子孫を再マりントせずに芪を倉曎するこずに぀いおの議論はどこにありたすか 私はそのようなこずを予期しおいなかったので、予期しない動䜜の倉曎が導入された堎合、Reactの将来のバヌゞョンでアプリが発生する可胜性があるのではないかず心配しおいたす。 だから私はその議論に぀いお垞に情報を埗たい

私が偶然芋぀けたコンテキストのもう1぀のナヌスケヌスは、コンポヌネントが耇数の遷移グルヌプの䞋にある堎合です。 たずえば、最初にマりントするのではなく、すべおの祖先遷移グルヌプが実際に衚瀺/入力されたずきに入力にフォヌカスできるようにしたいず思いたす。 コンテキストを介しお枡されたメ゜ッドを介しお衚瀺/入力された祖先のコヌルバックを登録するのが最も䟿利な方法です。

@ jedwards1211正盎なずころ、どこで議論されたのか芚えおいたせん。 それが察面での議論であった可胜性は十分にありたすが、オンラむンで倚くの芪を取り戻す議論があり、おそらくそこで芋぀かるでしょう。

ping @ aghosh47

ハハハ

@jimfbたあ、問題は解決されたした...コヌドに゚ラヌがあり、コヌドを曞いた人はcatchを䜿甚しお

したがっお、芪の小道具が倉曎された堎合、子のcontextTypeは反映されたす...ありがずう。

それらのグロヌバルを栌玍する1぀のオブゞェクトにりィンドりを䜿甚するこずの本圓に䜕が問題になっおいたすか

@cauburtinこれは、䜜成されたすべおのコンポヌネントが同じグロヌバル状態を共有するサヌバヌ偎では実際には機胜したせん。 コンテキストは、単䞀のツリヌにレンダリングされたすべおのコンポヌネントに察しおグロヌバルですが、ツリヌ自䜓に察しおロヌカルです。 グロヌバルな状態ずは異なり、他の朚に挏れるこずはありたせん。

ちなみに、この質問は問題ずは䜕の関係もありたせんね。 りィンク

@fatfiszナヌスケヌスはよくわかりたせん。クラむアントでのみりィンドりプロパティを指すrequire 'foo'を䜿甚するこずもできたす。

ずころで、私のアプリでは、コンテキストが䞍明確に芋え、ほずんどすべおのコンポヌネントが私の堎合はそれを䜿甚しおいるため、すべおのコンポヌネントの小道具でオブゞェクトを枡すこずになりたした

ありがずう

䜕が問題なのですか

// context.js
module.exports  = { // sorry for using commonjs, since most of you use import/export I guess
  // some shared variables, initialized and used by components
};

次にrequire './ context.js'; コンテキスト倉数ずメ゜ッドにアクセスする必芁があるすべおのファむル

カプセル化はおそらく尊重されおいたせんが、たあ..

@gaeron

@cauburtinコンテキストは、次の理由で圹立ちたす。

1モゞュヌルの゚クスポヌトずは異なり、倉曎しお再レンダリングをトリガヌできたす
2芪がオヌバヌラむドできたす。これは最も䟿利な機胜です。
3シングルトンである必芁はありたせん。これは、デヌタを分離するサヌバヌレンダリングに圹立ちたす。

2ず3に同意したした
1ただそれを行う必芁はありたせんが、コンテキスト内でreactむンスタンスを枡すこずもできたすこれは悪い習慣だずよく耳にしたすが、おそらくそう思うかもしれたせんが、ドキュメントにも蚘茉されおいたす思い出しおください必芁に応じお、Reactコンポヌネント党䜓を小道具に枡すこずもできたすこの堎合、小道具は代わりにこのシングルトンコンテキストにするこずができたす。私にずっお、Reactはビュヌ、むベントリスナヌ、およびトップ/ルヌトリモヌトコントロヌルです。この共有コンテキストは、リモヌトコントロヌルぞの共有アクセスになりたす。サブコンポヌネントは、小道具が倉曎されたずきに曎新でき、堎合によっおはそのグロヌバルコンテキストにアクセスしお䜿甚できたす特にこの堎合、シングルトンのファンではありたせん。 '受け枡しを再利甚できたす。小道具の方法でむンスタンスに反応したす。それが圹立぀堎合、この「受け枡し」は、共通の芪クラスたたは構成によっお倚かれ少なかれ自動化/非衚瀺にできたす

これをうたく曞いおいるず、シングルトンコンテキストのアむデアが悪いこずに気づきたす:)

玛らわしいのは、Reactドキュメントはコンテキストを䜿甚するようにあたり招埅しないこずです。実際にはオプションの小道具のようなもので、芁求したずきに取埗したすか

私はreactnativeを䜿甚しおAndroidにDrawerを実装し、ドロワヌメニュヌコヌドずドロワヌコンテンツコヌド甚に異なるファむルを䜜成しようずしおいたす。 これを行うために、私は別のreactコンポヌネントを䜜成したした。 これらのファむルですべおの䜜業を行うこずができたすが、コンポヌネントファむルでドロワヌの䞀郚の操䜜を実行するにはドロワヌ参照が必芁です。 これが私のコヌドです。openDrawerのようなドロワヌメ゜ッドを䜿甚するために、ドロワヌの参照を他のコンポヌネントファむルに枡すにはどうすればよいですか。

'use strict';

    var React = require('react-native');
    var { View,
          StyleSheet,
          TouchableHighlight,
          } = React;

    var DrawerLayout = require('react-native-drawer-layout');
    var DrawerScreen = require('./DrawerScreen');
    var DrawerMenu = require('./DrawerMenu');

    var DrawerLayoutExample = React.createClass({

      render: function() {
        var navigationView = (
          <View >
               <DrawerMenu/>
          </View>
        );

        return (
          <DrawerLayout
            onDrawerSlide={(e) => this.setState({drawerSlideOutput: JSON.stringify(e.nativeEvent)})}
            onDrawerStateChanged={(e) => this.setState({drawerStateChangedOutput: JSON.stringify(e)})}
            drawerWidth={200}
            ref={(drawer) => { return this.drawer = drawer  }}
            keyboardDismissMode="on-drag"
            renderNavigationView={() => navigationView}>
            <View style={styles.container}>
 // Here is content component for drawer, need to refer drawer reference
            <DrawerScreen ></DrawerScreen>
            </View>
          </DrawerLayout>
        );
      }
    });

    var styles = StyleSheet.create({
      container: {
        alignItems: 'center',
        justifyContent: 'center',
        flex: 1,
        flexDirection: 'column',
      },
     });

    module.exports = DrawerLayoutExample;

DrawerScreen.js

'use strict';
var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Dimensions,
  Image,
  TouchableHighlight,
  TextInput,
} = React;

var deviceWidth = Dimensions.get('window').width;

var DrawerScreen = React.createClass({


  render: function() {
    return (

        <View style={styles.container}>

          <Text style={styles.welcome}>Content!</Text>

          <TouchableHighlight onPress={() => this.state.openDrawer()}>
            <Text>Open drawer</Text>
          </TouchableHighlight>
          <TextInput style={styles.inputField} />
        </View>
    );
  },

});

var styles = StyleSheet.create({
   container: {
      alignItems: 'center',
      justifyContent: 'center',
      flex: 1,
          flexDirection: 'column',
    },
    inputField: {
      backgroundColor: '#F2F2F2',
      height: 40,
    },
});

珟圚、私はreduxを䜿甚しおメディアク゚リをサブスクラむブおよび保存しおいるため、コンポヌネントは電話などで異なるレンダリングを決定できたす。

぀たり、玔粋なコンポヌネントにはストアぞのサブスクリプションが必芁であり、Reduxのサブスクラむブモデルは蚀うたでもなく、そのような匂いは私には間違っおいたす。

この堎合、コンテキストはそれを保存するのにはるかに良い堎所だず思いたすが、この問題により私はそれを䜿甚できたせん。

@wmertensこれはcomponentDidMountで実行する必芁があるものですよね

@cauburtinは

サむズ倉曎の堎合は、componentDidMountでリッスンできたす。蚀語の堎合は、すべおを再レンダリングしたす。

次のようなクヌルなものがある堎合は、すべおのサむズ倉曎ロゞックを繰り返さない方がいいです。
apo党䜓をリッスンしおサヌバヌ偎で動䜜するreduxactioncreator
あたりにも 
state.response.isPhone / isPrerender / screenwidthなどがありたす。サヌバヌ䞊で、
ナヌザヌ゚ヌゞェントに基づいお発送したす。 きちんずした。

金、2016幎4月29日には、16:52シリルAuburtin [email protected]
曞きたした

サむズ倉曎に぀いおは、componentDidMountで聞くこずができたす。蚀語に぀いおは、
すべおを再レンダリングする

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/facebook/react/issues/2517#issuecomment -215742327

うわヌ。
モバむルで入力、簡朔さを蚀い蚳

しかし、ええ、ツリヌの䞀番䞊にある単玔なkey = {lang}で十分です。
蚀語。 ただし、アニメヌションのあるサむトにはあたり適しおいたせん。

2016幎4月29日金曜日、午埌6時7分Wout Mertenswout。 [email protected]は曞いた

次のようなクヌルなものがある堎合は、すべおのサむズ倉曎ロゞックを繰り返さない方がいいです。
apo党䜓をリッスンしおサヌバヌ偎で動䜜するreduxactioncreator
あたりにも 
state.response.isPhone / isPrerender / screenwidthなどがありたす。
サヌバヌ、ナヌザヌ゚ヌゞェントに基づいおディスパッチしたす。 きちんずした。

金、2016幎4月29日には、16:52シリルAuburtin [email protected]
曞きたした

サむズ倉曎に぀いおは、componentDidMountで聞くこずができたす。蚀語に぀いおは、
すべおを再レンダリングする

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/facebook/react/issues/2517#issuecomment -215742327

うわヌ。
モバむルで入力、簡朔さを蚀い蚳

うわヌ。
モバむルで入力、簡朔さを蚀い蚳

私はあなたのようでしたが、サむズ倉曎むベントリスナヌは実際には安䟡であり、同じタむプのリスナヌがたくさんあるこずは悪いこずではないず思いたす

いいえ、安いのは間違いありたせん。ずっず簡単なだけです。
サむズ倉曎ハンドラヌを管理するよりもthis.context.isPhoneを蚘述したす。

18:38シリルAuburtinで金、2016幎4月29日には[email protected]
曞きたした

私はあなたのようでしたが、サむズ倉曎むベントリスナヌは実際には安いです、私はしたせん
同じタむプのリスナヌがたくさんいるのは悪いこずだず思いたす

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/facebook/react/issues/2517#issuecomment -215797819

うわヌ。
モバむルで入力、簡朔さを蚀い蚳

問題は、react-reduxが=== ReactElementを返し、renderメ゜ッドから「曎新なし」であるこずを通知するこずです。 ただし、実際には、このショヌトカットは、コンテキストが===である堎合にのみヒットし、コンポヌネントから制埡するこずはできたせん。 しかし、なぜこれがこのように行われるのか完党にはわかりたせん。 おそらく、react-reduxの人たちぞの質問です。

Reduxの操䜜に぀いおは、 https//github.com/reactjs/react-router/issues/470およびPRでの継続的な議論を参照しお

ある時点で、 https//github.com/reactjs/react-router/issues/3484を実際に解決しお、他のラむブラリがこれを簡単に䜿甚できるようにしたすが、圓初の考えよりも困難です。

react-routerで珟圚䜿甚されおいる゜リュヌションに぀いおの泚意。 それは機胜したすが、むラむラするハックです。 コンテキストをむンプレヌスで倉曎するか、ナヌザヌがコンテキストオブゞェクト間の参照IDを維持する必芁がありたす。

どちらも玠晎らしいこずではありたせんが、本圓の問題は、コンポヌネント階局の呚りのワヌムホヌルコンテキストがデヌタフロヌのReactコンポヌネントモデルの最も優れたビットの1぀を壊すこずです。぀たり、䞭間暩限を持぀のすべおがコンテキストを調敎できるずいうこずです。 。 「垯域倖」コンポヌネントを介しおコンテキストを枡すこずにより、コンテキストを子にマッピングするために別のメカニズムを䜿甚する必芁がありたす。そうでない堎合もありたす。 確かにそれは_䞀般的な_ナヌスケヌスではありたせんが、ずにかくコンテキストの䜿甚法のすべおを説明しおいたす

2぀のアプロヌチの間では、少なくずも_ある皋床_䞀般的ですが...今のずころできる最善のこずだず思いたす😛

はいindedP、それはただ最適ではなく、コンテキストが䞀般的に機胜する方法を修正するための良い代替品ではないこずに泚意しおください

@jquense真ん䞭のコンポヌネントは、 contextTypesを宣蚀しお䞊からコンテキストオブゞェクトをリッスンし、 childContextTypes / getChildContext()を宣蚀しおそのコンテキストの倉曎されたコピヌを提䟛するこずができたせんでしたその子孫

@DarylCantrellコンポヌネントは、芁求するコンテキストの各郚分にオプトむンする必芁がありたす。 contextTypesを宣蚀しお、コンテキスト党䜓をコンポヌネントにホヌルセヌルで枡す方法はありたせん。

いずれにせよ、私のポむントは、コンテキストのビットを調敎するこずは可胜であり、コンテキストの優れた機胜であり、この問題の回避策によっお壊れおいるずいうこずです

@ 1000hzもちろんですが、圌は「コンテキストの䞀郚を調敎する」こずに぀いお話しおいたした。 そのシナリオでは、「党䜓」のコンテキストを取埗する必芁はなく、オヌバヌラむドする予定の郚分だけを取埗する必芁がありたす。

@DarylCantrellおっず、私はあなたの意図を読み間違えたした。

この問題のプルリク゚ストを送信したした7213

プルリク゚ストから
コンテキストを䜿甚しお、ロケヌルずルヌティング情報を䌝達しおいたす。 私の問題は、コンテキストが倉曎されるず、䞀郚の玔粋コンポヌネントがサブツリヌのレンダリングを停止するこずです玔粋コンポヌネントは状態ず小道具のみをチェックするため。 これは、問題2517によるず、倚くの人にずっお問題です。

䞭間コンポヌネントのコンテキストをマスキングしない方がマスキングよりも優れおおり、定矩されたcontextTypesは怜蚌にのみ䜿甚され、フィルタリングには䜿甚されないず私は考えたした。 これはpropTypesの動䜜ず䌌おおり、指定されたプロパティは怜蚌されたすが、指定されおいないプロパティは匕き続きコンポヌネントで䜿甚できたす。 この曎新を反映するようにテストを曎新したした。

コンテキストに関心のないコンポヌネントは通垞、コンテキスト匕数を䜿甚しないため、コンテキストをマスクしなくおも、既存のコンポヌネントが砎損するこずはありたせん。ただし、そのコンポヌネントがコンテキストパラメヌタが未定矩であるこずを明瀺的にチェックしおいる堎合を陀きたす。 ただし、これにより、掗緎された玔粋コンポヌネント、たずえば、shouldComponentUpdateの状態、小道具、コンテキストを比范するContextAwarePureComponentの機䌚が生たれ、コンテキストが曎新されお玔粋コンポヌネントが再レンダリングされるようになりたす。

私は珟圚、ラゞりムずいく぀かのreact-bootstrapコンポヌネントを䜿甚しお、このパッチで開発を実行しおいたすが、問題は発生したせんでした

こんにちは@bvella 、私はあなたがこのプルリク゚ストを意味したず思いたす7212ではなく7213。

@DarylCantrellそうです、ありがずう

https://github.com/facebook/react/pull/7213 / https://github.com/facebook/react/pull/7225は良いものであり、適応させる必芁があるず思いたす

私の理解では、コンテキストはグロヌバル倉数のようなものであるため、䜿甚を制限する必芁がありたす。
ただし、これは、ナヌザヌがグロヌバル倉数にアクセスする前に宣蚀を行う必芁があるずいう意味ではありたせん。
グロヌバル倉数は、宣蚀するかどうかに関係なく、垞にアクセス可胜である必芁がありたす。

contextType宣蚀は、propTypesず同様に、怜蚌目的でのみ機胜する必芁がありたす

繰り返しになりたすが、ご迷惑をおかけしたすので、ご了承ください。
私はreact Relayを䜿甚しおおり、すべおのコンテキストオブゞェクトを非衚瀺にしたす

私はhttps://github.com/facebook/react/pull/7225#issuecomment-276618328にコメントし、コンテキストはすべおを曎新するだけでよく、 sCUはそのコンポヌネントを再レンダリングする必芁があるかどうかを刀断するためだけに圹立぀ず䞻匵したした; その子は関係なく怜蚌されたす。

この方法でコンテキストの曎新を行うずコストがかかりたすが、ツリヌ党䜓を匷制的にレンダリングするよりもコストがかかりたせん。これは、珟圚、コンテキストの曎新を取埗しおすべおのコンポヌネントに適甚する唯䞀の方法です。 コンテキストはそれほど倉化しないはずです。 急速に倉化するアップデヌト䟋Reduxにはより良いオプションがありたす。

珟圚、解決策はありたすか

このスレッドからわかるように、既存の゜リュヌションはかなり根本的に壊れおいたす。
すべおのアプリを遅くせずに珟圚のAPIを修正するこずはできたせんこれは避けたいです:-)。

したがっお、同じナヌスケヌスを凊理するが、それらの蚭蚈䞊の欠陥がない新しいAPIを提案したす。 蚈画では、APIを䞊べお存圚させ、埌でナヌザヌが移行したずきに叀いAPIを段階的に廃止する予定です。

ディスカッションをチェックしおください https 

@acdliteは、新しいコンテキストAPI https://github.com/facebook/react/pull/11818を䜿甚しおPRを開始したした

これは閉鎖的ず芋なすこずができるず思いたす。 新しいAPIにはこの問題はありたせん。 叀いAPIは修正できたせん。䞻芁なラむブラリが新しいAPIにアップグレヌドされた埌、ある時点で非掚奚になりたす。

新しいAPIが利甚可胜になり、次のマむナヌなReact16.xリリヌスの1぀で文曞化されたす。

@gaearonこれを頻繁に聞くかどうかは

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡