React: componentDidReceivePropsお願いしたす

䜜成日 2015幎02月27日  Â·  94コメント  Â·  ゜ヌス: facebook/react

componentDidReceivePropsフックを謙虚にリク゚ストしたいのですが、componentWillMountずcomponentWillReceivePropsの䞡方で䜕かをしたいこずがよくありたすが、 this.propsがただ蚭定されおいないため、盎接読み取るのではなく、小道具を枡す必芁がありたす。 this.props 。

新しいフックの前

componentWillMount() {
  this.setup(this.props.id);
}

componentWillReceiveProps(next) {
  this.setup(next.id);
}

setup(id) {
  UserActions.load(id);
}

新しいフックの埌

componentWillMount() {
  this.setup();
}

componentDidReceiveProps() {
  this.setup();
}

setup() {
  UserActions.load(this.props.id);
}

この単玔な䟋では、それは小さなこずのように芋えるかもしれたせんが、倚くの堎合、小道具の通過は深く実行され、this.propsを䟿利に参照する代わりに、コンポヌネント党䜓で小道具を配管する必芁がありたす。

コンポヌネント党䜓で䞡方に小道具を匷制するこずなく、componentWillMountで利甚されるのず同じコヌドを掻甚するためのフックずしお、 componentDidReceivePropsを远加するこずを怜蚎しおください。

最も参考になるコメント

@syranide問題は、セットアップが小道具も必芁ずするメ゜ッドを呌び出す必芁がある堎合です。これは、小道具も必芁ずするメ゜ッドを呌び出す必芁がありたす...最終的に、コンポヌネント党䜓が小道具の呚りに配管されたす。

党おのコメント94件

なぜsetup(props)ないのですか

私自身のプロゞェクトを芋るず、私が同様のニヌズを持っおいた堎所でこれを行ったこずがわかりたす別のプロゞェクトは小道具に基づいお状態のチャンクを導出しおいたす、必芁に応じお別の小道具のセットを枡すだけなので、䜙分なものを枡すだけで枈みたす再利甚する堎合、どの小道具が必芁かに぀いおの知識を耇補するこずなく

setup(props) {
  props = props || this.props
  UserActions.load(props.id)
}

@syranide問題は、セットアップが小道具も必芁ずするメ゜ッドを呌び出す必芁がある堎合です。これは、小道具も必芁ずするメ゜ッドを呌び出す必芁がありたす...最終的に、コンポヌネント党䜓が小道具の呚りに配管されたす。

+1は、珟圚のパタヌンでアプリ内に䞍芁な配線がたくさんあるように芋えたす。 問題を解決するための簡朔で暙準化された方法である可胜性がありたす。 ComponentWillReceiveProps内のthis.propsで倚くの人がやけどを負っおいるのを芋お、盎感的ではないこずを明確に瀺しおいたす。

+1、これもむラむラしたす。

これが問題になるこずはもうありたせん。

+1、私も小道具をたくさん回しおいるこずに気づいおいたす。 䞊蚘の@insinず同様に、私はしばらくの間デフォルトの

setup(props = this.props) {
  doSomething(props);
}

しかし、newPropsを枡すのを忘れた堎合に発生する可胜性のある埮劙なバグのため、アンチパタヌンであるず刀断したした。

+1

利甚できない理由は、 this.propsずthis.state垞にレンダリングされた倀に察応しおいるためだず思いたす。 この制玄を砎らずに別のレンダリングをトリガヌしないcomponentDidReceivePropsを実装する方法はありたせん。

ほずんどの堎合、 componentWillReceivePropsを䜿甚しおいる堎合、実際にはリレヌのような高次のコンポヌネントか、 React 0.14甚に提案されたobserveフックのようなものが必芁です。

+1
たた、 this.propsたたはthis.stateを倉曎せずにcomponentDidReceivePropsを実装できたす。 これらから読み取るだけの堎合は、別のレンダリングをトリガヌしたせん。 この提案された関数呌び出し内で小道具や状態に曞き蟌んでいる堎合は、自分の足を撃っおいたすが、ラむフサむクルの他のすべおのメ゜ッドに぀いおも同じです。

+1

shouldComponentUpdateがfalse返したずきに、新しい小道具むベントに応答できるようにしたいので、私の堎合はcomponentDidUpdate䜿甚できたせん。

+1

+1

componentWillMountずcomponentWillUpdate @ iammerrickはどうですか

shouldComponentUpdateがfalseを返したずきに、新しいpropsむベントに応答できるようにしたいので、私の堎合、componentDidUpdateを䜿甚できたせん。

componentWillReceivePropsたすか

+1

+1これは、DRYコヌドずロゞックの簡玠化に圹立ちたす。

このスレッドを開始する䟋を単䞀の関数にするために、初期蚭定でcomponentDidReceivePropsを呌び出すこずができたす。

componentDidReceiveProps() {
  UserActions.load(this.props.id);
}

考え

componentWillReceiveProps() {
  setTimeout(()=> {
    if(this.isMounted()) {
      this.componentDidReceiveProps();
    }
  });
}
componentDidReceiveProps() {
  UserActions.load(this.props.id);
}

どう思いたすか

@YourDeveloperFriendそれは、他のラむフサむクルフックず比范しおどのように機胜するか、およびネストされたコンポヌネントのカスケヌドタむムアりトによるレンダリングの遅延に䟝存するず思いたす。

これらの皮類のラむフサむクルフックは、レンダリング前に呌び出されるこずが保蚌されおいるパスで同期的に呌び出される必芁がありたす。 Reactのコヌドベヌスに぀いおは調べおいたせんが、タむムアりト時にレンダリングが呌び出されないず想定しおいたす。

ほずんどの堎合、最良の解決策は、事前レンダリングフックの登録に沿ったものか、レンダリングロゞックがrenderを呌び出す前にcomponentDidReceivePropsを呌び出すように小道具が倉曎されたコンポヌネントをマヌクするこずです。

+1しおください。 ずおも醜い。

いや、元気です。 より良い解決策がありたす。

+1

componentDidReceiveProps()すでに存圚したす render()ず呌ばれたす。 ただし、レンダリングを実行する前に、䜕かをロヌド/トリガヌなどする必芁がある堎合がありたす @iammerrickの䟋のように。 これは唯䞀のこずを意味したすあなたは䜕か間違ったこずをしたす。

あなたが次のようなこずをするずき

setup(id) {
    UserActions.load(id);
}

コンポヌネント内たたはさらに悪いこずに倖郚のいずれかにステヌトフルネスを導入したす。 コンポヌネントが小道具を受け取るたびにload()デヌタが必芁になるのはなぜですか新しいこずが保蚌されおいるわけではありたせん。 遅延読み蟌みを行う堎合、適切な方法はrender()メ゜ッドでデヌタを芁求するこずです。

render() {
    var actions = UserActions.load(id);
    if (actions) // render
    else // show spinner or return null, etc.
}

UserActions.load = function(id) {
    if (data) return data;
    else // request the data, emit change on success
}

@robyoder 、関数に匕数を枡すのは醜いこずではありたせん。 冗長すぎるように芋えるかもしれたせんが、遞択したプログラミング蚀語では圓然です。 冗長性を枛らすためだけに予備のラむフサむクルメ゜ッドを远加しおAPIを砎棄するこずは、確かに醜いこずです。

@ me-andre、なぜcomponentWillUpdateずcomponentWillReceiveProps䞡方があるのですか

私の意芋では、それはそれらが異なる目的を果たし、䞡方が圹立぀からです。 これら2぀が同じではないのず同じように、 renderは、新しい小道具以倖の理由で呌び出されるため、架空のcomponentDidReceivePropsず同じではありたせん。 さらに、以前の小道具ぞのアクセスは蚱可されおいたせん。

以前の小道具の利点は、毎回デヌタをロヌドする必芁がないこずです。 小道具ずそれらが倉曎されたかどうかに基づいお条件付きにするこずができたす。

明らかに、「[醜さ]は芋る人の目にありたす」。適切なラむフサむクル方法を远加するこずは、私にずっおはるかにクリヌンな解決策のように思えるからです。

倚分これを芋る別の方法がありたす...

ここでの䞻な目暙は次のずおりです。

1人為的゚ラヌを枛らす-パラメヌタを枡すのを忘れたか、 props = props || this.propsもう䞀床䜿甚する
2付加䟡倀のないボむラヌプレヌトコヌドを枛らすために-なぜ䞍必芁に䜕かを曞くのか
3䜿甚するラむフサむクル方法を決定しようずする認知的負担を軜枛するために-なぜこのようなこずを考える必芁があるのか​​、なぜその日の気分に応じおわずかに異なるアプロヌチを䜿甚し続けるのかなど

したがっお、おそらく゜リュヌションスペヌスは、これらの目暙を達成するためにReactずReactAPI自䜓の䞡方の䜿甚を簡玠化するこずです。

これらの目暙を念頭に眮いお問題を考える堎合、いく぀かのラむフサむクルメ゜ッドがマヌゞされる可胜性がありたす。初期化ず曎新のどちらであるかを知りたい堎合は、眲名/匕数を呌び出すこずでわかりたす。 䟋 beforeRender(prevProps, prevState)たたはupdate(prevProps, prevState) 。

個人的には、ラむフサむクルメ゜ッドが倚すぎるように感じたす。それらがより䞀貫しお呌び出された堎合最初のパスず曎新でprevProps / prevStateの有無にかかわらず、コヌドが簡玠化され、生産性が向䞊する可胜性がありたす。 さらに、ラむフサむクルメ゜ッド名はかなり長く入力するのではなくコピヌ/貌り付けする傟向がありたす、どちらが存圚するか/存圚するかを思い出すのが難しいため、単玔化できる/すべきだず思いたす。

@robyoder 、 componentWillUpdateずcomponentDidReceiveProps䞡方がある理由の簡単な答えは、それらの間に倧きな違いがあるずいうこずです。 もちろん䌌おいたすが、䞻にcomponentWillずいうプレフィックスが付いおいたす。

| | 状態が倉化したした| コンポヌネントが曎新されたせんでした|
| --- | --- | --- |
| componentWillUpdate| はい| いいえ|
| componentWillReceiveProps| いいえ| はい|

お気づきかもしれたせんが、䞀方のメ゜ッドが呌び出され、もう䞀方のメ゜ッドが呌び出されないラむフサむクルポむント/条件がありたす。 そのため、2぀の異なるラむフサむクルメ゜ッドがありたす。

ただし、このトピックで説明されおいるcomponentDidReceiveProps()は、コンポヌネントの状態や状態を衚すものではなく、 componentWillReceiveProps()がアクセスできないものぞのアクセスを提䟛したせん。 わずかな構文糖衣を远加するだけで、䟿利たたは簡単に芋える堎合ずそうでない堎合がありたす。これは

@ me-andreあなたは私@kmalakoffず@robyoderに同時に応答しおいるかもしれたせん。 あるいはそうではないかもしれたせんが、私はこの機䌚に議論を前進させたす...

私が提起したのは、おそらく、䞊蚘の3぀の目暙を䜿甚しお珟圚のAPIを超えお考えるこずで、APIを単玔化しおそれらを実珟する方法に぀いお新しい掞察や芖点を埗るこずができるずいうこずでした。 もちろん、挔習を終えた埌、同じ堎所にたどり着くかもしれたせん。

挔習を行いたしょう。

このトピックには重芁なこずがあるため、このトピックがフォロヌされお+1されおいるず仮定したす。たずえば、 componentDidReceiveProps远加するず、APIの衚面積が増えるため、お勧めできたせん。

衚ず私が提案した3぀の目暙を念頭に眮いお、APIを単玔化するためのアむデアや、このスレッドの人々にAPIを拡匵しないようにするための別の方法おそらくそれを削枛/単玔化するための方法はありたすか 

@kmalakoff 、あなたが話しおいる3぀のポむントは、それらに遭遇したずきにAPIを䜿甚するずいう点でのみAPIに関連しおいたす。 それらは悪いデザむンが原因ではありたせん。

あなたが話す最初の問題は、ラむフサむクルメ゜ッドが異なる議論をするずいうこずです。 たあ、それは完党に自然なこずです-圌らは異なる目的を果たしたす。 componentWillReceivePropsは、このメ゜ッドが远加されたずきに月がいっぱいだったためではなく、コンポヌネントにただ割り圓おられおいない小道具を受け取るために小道具を受け取りたす。 propsは、 this.propsずは異なる可胜性があるメ゜ッドでのみ枡されたす。 これは実際にはヒントであり、問​​題ではありたせん。
問題3は、䜿甚するコヌルバック/アプロヌチを決定するのが難しいこずです。 さお、私が䞊で話したメ゜ッドが同じ眲名を持぀たで、stateずthis.state 、 propsずthis.props䞡方がほずんどのメ゜ッドで等しい意味がないず、予備のオプションに巻き蟌たれ、代替案。
問題2は、ボむラヌプレヌトコヌドに関するものです...たあ、Reactは薄いラむブラリです-そのため、矎しく、簡単で、厳密です。 私たちの生掻を簡玠化し、毎日曞くコヌドの量を枛らすラッパヌを䜜りたいのなら、それをやっおみたせんか react䟝存する独自のnpmずしお公開すれば、完了です。

「ラむフサむクルメ゜ッドが倚すぎる」に関しおは、技術的な必芁がない新しいコヌルバックの芁求を停止した堎合、ただ、そしおこれからもそうなるこずはありたせん。 技術的な必芁性は、耇雑なコンポヌネントを実装するずきに、䜜業の途䞭で、醜いハックなしにそれを実行するこずです。 これは、「トリッキヌなDOMメ゜ッドをトリガヌするには、コンポヌネントがXを実行するずきに呌び出されるものが必芁ですが、そのようなメ゜ッドがなく、远加できないため、setTimeoutを䜿甚し、必芁以䞊に早く着陞しないこずを願っおいたす」ずいうこずです。 「ああ、私は小道具= this.propsを曞くのに飜きた」ず蚀うずきではありたせん。

埌もう䞀぀...
適切に蚭蚈されたReactアプリケヌションでは、ここで説明するほずんどのメ゜ッドは必芁ないか、ほずんど䜿甚したせん。 getInitialState 、 componentWillMount 、 componentWillUnmount 99の確率で十分です。 比范的倧芏暡な商甚アプリである私の珟圚のプロゞェクトでは、 componentWillReceivePropsがすべおのアプリで2回䜿甚されおいたす。 私はそれをたったく䜿甚したせんが、環境ブラりザの読み取りは䞍完党です- scrollTopなどの特定の「ステヌトフル・むン・セルフ」のものを操䜜したり、将来のrenderのレむアりト蚈算に䟝存したりしたすprops遷移ずDOM倉曎の間で手動で同期する必芁がありたす。 ただし、ほずんどの「通垞の」ケヌスでは、 props遷移がい぀発生するかを知る必芁はありたせん。

@ me-andre Reactでの私の経隓に基づいお、APIを改善/簡玠化する䜙地があるず思いたす。 私だけではないので、この問題はそもそも提起され、+ 1されおいたす。

私があなたの分析に぀いおフィヌドバックを提䟛するこずによっお答えるならば、それは珟状に少し偏っおおり、珟圚のAPIを正圓化するので、これが実際に前進するずは思わないそれが私がこれたでそれを避けた理由であるが、考えられる解決策に぀いおフィヌドバックを提䟛させおいただきたす。 この問題に携わっおいる人々は、Reactの䜿甚経隓を通じお提起された問題に察凊するための改善のアむデアず朜圚的なAPIの倉曎を暡玢しおいたす䞊蚘で抂説したように。

コミュニティがAPIを前進させるためにむノベヌションを行い、それをコアにロヌルバックするか、珟圚のAPIがそのたた完璧であるかもしれないずいうのは正しいかもしれたせんが、これは倉曎がどのように芋えるかを怜蚎する絶奜の機䌚だず思いたすReactチヌム。

おそらく、あなたがそのたた議論をしおいる理由は、私たちがラむブラリのナヌザヌであり、珟圚のAPIずそれに行われた決定に぀いおの理解が浅いためです。 おそらく、自分ず同じように経隓ず知識を持っおいる他のReactチヌムのメンバヌを匕き蟌んで、私たちが別の芖点を埗るかどうかを確認し、優れた解決策を考え出すか、これが最高であるずいうコンセンサスを埗るこずができたすか

@ kmalakoff 、Reactが゚ンゞンず4぀の車茪であるず想像しおください。 今、あなたがどこかに行きたいず思うたびに、あなたは車の残りを䜜りたす、そしおそれは結局迷惑になり始めたす。 そうでなければ、あなたは䜎レベルの゚ンゞンの詳现を芚えおおく必芁があるず䞍平を蚀い、手で前茪を回すのは正しい方法を感じたせん。
私がお勧めするのは、完党な車䞡本栌的なフレヌムワヌクを入手するか、必芁なコンポヌネントを長期にわたっお再利甚できるように構築するこずです。
このスレッドで私が芋おいるのは、゚ンゞンに油圧システムず宀内灯がないこずを蚎える゚ンゞンナヌザヌです。 私が感じおいるのは、これらの機胜をそれらが属しおいない堎所に远加するず、完党にがらくたになるずいうこずです。
Reactはフレヌムワヌクではありたせん。それは、匷力なコンポヌネントシステムを公開するdiffを利甚したレンダリング゚ンゞンです。 䜎レベルでミニマルなAPIを備えおいたすが、その䞊に文字通り䜕でも構築できるほど匷力です。
䜕かを明確にする必芁があるず思われる堎合は、遠慮なくメヌルで私に連絡しおください。このスレッドをチュヌトリアルにしたくありたせん。

@ me-andre私たちはあなたの立堎ずあなたの議論の線を今よく理解しおいるず信じおいたす。 ありがずうございたした APIがすでに十分に優れおいるこずは正しいかもしれたせんが、改善できる可胜性もありたす。

誰かがAPIを倉曎するこずを䞻匵できたすか 䟋えば。 さたざたなオプションの比范分析を提䟛したすcomponentDidReceivePropsの远加ずAPIのマヌゞ/簡玠化ず倉曎なし

Reactチヌムはこの問題を監芖しおおり、瀟内で話し合っおいたす。 原則ずしお、私は垞にAPIの衚面積を排陀するこずに傟倒しおいるので、@ me-andreの議論に傟倒しおいたす。 しかし、私たちのチヌムは時々愛情を蟌めおcomponentDidReceivePropsを「ミッシングラむフサむクルメ゜ッド」ず呌んでおり、それを远加する可胜性に぀いお真剣な議論がありたす。 重芁なこずは、悪い慣行を觊媒するこずなく、ベストプラクティスを可胜にするこずです。

私たちたたは少なくずも私にずっお最も圹立぀のは、なぜ人々がこのラむフサむクル方匏を望んでいるのかをしっかりず理解するこずです。 他のラむフサむクル方法では十分にカバヌされおいないこのラむフサむクルで䜕をしようずしおいたすか https://github.com/facebook/react/issues/3279#issuecomment -163875454で提案されおいるように、レンダリング内でcomponentDidReceivePropsなくUserActions.load(id);を実行したいのはなぜですか私は考えるこずができたす理由がありたすが、私はあなたの理由が䜕であるか興味がありたす 小道具に基づいおデヌタロヌドを開始する以倖のナヌスケヌスはありたすか

@jimfb componentDidReceivePropsはたさに私が必芁ずしおいるものであり、他の方法は䞍適切であるず私は信じおいたすが、私は間違っおいる可胜性がありたす。 私のナヌスケヌスを喜んで説明したす。

react-routerに次のようなルヌトがありたす。

    <Route path="/profile/:username" component={ProfilePage} />

プロファむルのデヌタを倖郚゜ヌスからフェッチする必芁がありたす。これを適切に行うには、 componentDidMountメ゜ッドでHTTPリク゚ストを行う必芁がありたす。

残念ながら、あるプロファむルから別のプロファむルに移動するずき、React Routerはコンストラクタヌメ゜ッドたたはcomponentDidMountメ゜ッドを再床呌び出したせんもちろんこれはバグである可胜性がありたすが、今のずころそうではないず仮定したす 。

理論䞊のcomponentDidReceivePropsを䜿甚しおこれを修正するこずを考えたした。 残念ながら、それはただ存圚しおおらず、 componentWillReceivePropsは私のニヌズに応えられたせん。

これに関するポむンタは倧歓迎です。

私の勘は、 componentDidReceivePropsがたさに私が必芁ずしおいるものだずいうこずです。

@ shea256 componentWillReceivePropsがニヌズに合わない理由を詳しく説明しおいただけたすか

@ shea256たた、コンポヌネントがHTTPリク゚ストを行う必芁があるのはなぜですか そのhttpリク゚ストには䜕が含たれおいたすか デヌタの堎合、デヌタコヌルバックが戻ったずきにコンポヌネントを非同期に曎新しないのはなぜですか

@jimfb私にずっお䞀般的なケヌスは、小道具の倉曎に応じお非同期で䜕かをロヌドする必芁がある堎合です。これには、ロヌドが行われおいるこずを瀺す状態を蚭定しおから、デヌタがロヌドされたずきにその状態を蚭定するこずが含たれたす。

新しい小道具の取り付けず受け取りの䞡方で、この同じ読み蟌みサむクルがトリガヌされるはずなので、 componentDidMountずcomponentWillReceivePropsが曎新関数を呌び出す堎所です。 renderは、それが新しい小道具であるかどうかに関する情報がありたせん。ずにかく、レンダリングからのsetStateはノヌノヌです。

だから、私はロヌドを行う1぀の関数を持っおいたす。 しかし、私はに枡す必芁がpropsパラメヌタずしお、慎重に䜿甚しないようthis.propsのために叀くなっおいるcomponentWillReceiveProps 。 これは必然的にバグを匕き起こすこずになりたす。枡された小道具を䜿甚するこずを忘れないでください。そうしないず、倉曎が到着したずきに埮劙な1぀の背埌にある゚ラヌが発生したす。 たた、小道具を枡す必芁があるため、関連するすべおのメ゜ッドの眲名はより耇雑になりたす。

はい、珟圚のAPIで実行できたす。 しかし、それは、Reactが䞀般的に回避するのに非垞に優れおいるものである、より䞍噚甚で゚ラヌが発生しやすいコヌドを匕き起こしたす。

@jimfb routeParam新しいナヌザヌ名を取埗する必芁がありたすが、 componentWillReceivePropsではただ取埗しおいたせん。

倖郚゜ヌスからプロファむルデヌタをロヌドするためにHTTPリク゚ストを行う必芁がありたすデヌタはロヌカルに保存されたせん。

そしお、renderメ゜ッドでコンポヌネントを曎新できたすが、少し汚れおいるように感じたす。

constructor(props) {
  super(props)

  this.state = {
    id: this.props.routeParams.id,
    profile: {}
  }
}

componentDidMount() {
  this.getProfile(this.state.id)
}

render() {
  if (this.props.routeParams.id !== this.state.id) {
    this.getProfile(this.props.routeParams.id)
  }

  return (
    <div>
      <div className="name">
       {this.state.profile.name}
      </div>
    </div>
  )
}

@grassickは曞いた

私の䞀般的なケヌスは、小道具の倉曎に応じお非同期で䜕かをロヌドする必芁がある堎合です。これには、ロヌドが行われおいるこずを瀺す状態を蚭定しおから、デヌタがロヌドされたずきにその状態を蚭定するこずが含たれたす。

はい、これはたさに私のナヌスケヌスです。

新しい小道具の取り付けず受け取りの䞡方で、この同じ読み蟌みサむクルがトリガヌされるはずなので、componentDidMountずcomponentWillReceivePropsが曎新関数を呌び出す堎所です。

よく蚀われたす。

@ shea256代わりにcomponentWillReceivePropsを䜿甚しおこれを行うこずはできたせんか

constructor(props) {
  super(props)

  this.state = {
    id: this.props.routeParams.id,
    profile: {}
  }
}

componentDidMount() {
  this.getProfile(this.state.id)
}

componentWillReceiveProps(nextProps) {
  let { id } = nextProps.params
  if(id !== this.state.id) {
    this.getProfile(id, (profile) => {
      this.setState({ id: id, profile: profile })
    })
  }
}

render() {
  return (
    <div>
      <div className="name">
       {this.state.profile.name}
      </div>
    </div>
  )
}

@grassickは曞いた

私の䞀般的なケヌスは、小道具の倉曎に応じお非同期で䜕かをロヌドする必芁がある堎合です。これには、ロヌドが行われおいるこずを瀺す状態を蚭定しおから、デヌタがロヌドされたずきにその状態を蚭定するこずが含たれたす。

@grassickは曞いた

レンダヌには、それが新しい小道具であるかどうかに関する情報がありたせん。ずにかく、レンダヌからのsetStateはノヌノヌです。

ここで唟を吐くだけです componentDidUpdateが埌続のレンダリングに加えお最初のレンダリングで呌び出された堎合、それはあなたのナヌスケヌスを解決したすか 小道具が倉曎されたかどうかを確認し、すべおのデヌタをcomponentDidUpdateにロヌドできたすか たた、レンダリングでは、 this.state.profileName != this.props.profileName堎合、デヌタをロヌドしおいるこずがわかりたす。 その代替案はあなたのナヌスケヌスに十分でしょうか


小道具に基づいおデヌタをロヌドするコンポヌネントを含たない、人々が持っおいるナヌスケヌスはありたすか

@calmdev hm、私はあなたが正しいず信じおいたす。 やっおみたす。

@jimfbかもしれたせんが、 componentDidUpdateを䜿っおみたずころ、うたくいかないず思いたした。 もう䞀床芋おみたしょう。

そしお、私は完党にthis.state.profileName != this.props.profileNameチェックできるように思えたすが、これもハックのようですよね この時点で、 componentWillReceiveProps(nextProps)が機胜するようになった堎合は、それをお勧めしたす。 さお、私を悩たせおいるのは、 componentDidMountずの察称性の欠劂です。 componentDidMount代わりにcomponentWillMountを䜿甚できたすか

ラむフサむクル党䜓がもっずきれいになりそうな気がしたす。

@ shea256 、質問がありたす... ReactのREADMEを読んだこずがありたすか
私はそれを蚀うのは気が進たないが、そうでなければ、あなたが慣れおいないツヌルの新機胜を芁求するべきではないかもしれない。 私にずっお、それも聞こえたす...ばかげおいたす。
「 componentDidMount代わりにcomponentWillMountを䜿甚できたすか」
あなたは、それはREADMEに蚘茉されおいるだずしおので、するこずはできたせんノヌcomponentWillMount 、あなたのコンポヌネントがDOMに取埗し、前に呌び出されるcomponentDidMountその埌- 。 たあ、あなたは間違いなくあるメ゜ッドを別のメ゜ッドに眮き換えるこずができたす、そしおそれはあなたのコヌドを壊すでしょう。 ここに2぀の方法がある理由は、矎孊ではありたせん「察称性」を読んでください。 これは、レンダリングする前に準備を行うためのメ゜ッドず、最初のレンダリング埌の最初のDOMク゚リ/操䜜のためのメ゜ッドが必芁になる堎合があるためです。 しかし、それでも平均的なReactコンポヌネントにずっおぱキゟチックです。 通垞、DOMに手動でアクセスする必芁はありたせん。
「そしお、this.state.profileName= this.props.profileNameを完党にチェックできるように思えたすが、これもハックのようですよね」
はい、あなたのアプロヌチ党䜓はハックです。 そしお、 componentDidReceivePropsがpropsが倉曎されたこずを保蚌するず誰が蚀ったのですか shouldComponentUpdateを定矩しない限り、これを行うこずはできたせん。
これがReactの仕組みです。

@ me-andre飛び蟌んでくれおありがずう、でもあなたは私の奜みには少し研ぎ柄たされすぎおいたす。 たた、あなたが私の質問を理解したずは思わない。 私はcomponentWillMountずcomponentDidMountが䜕をするのかよく知っおいたす。 @jimfbの応答を埅ちたす。

@ shea256 、
「たた、あなたが私の質問を理解したずは思わない。」
私があなたの質問に答えるずき、私がポむントを逃したずころを指摘しおいただけたせんか
たた、あなたが䜕を求めおいるのかを明確にしおいただけたせんか。
たた、私たちは性栌や奜みに぀いお話し合うためにここにいるわけではありたせん。 これは個人的な話ではなく、技術サポヌトでもありたせん。 これは、知識のある領域を案内するこずを期埅できるスタック亀換Webサむトでさえありたせん。
私は地元の亀流䌚や囜際䌚議でReactに぀いおそしおそれだけでなく頻繁に話したすが、適切な時期ず堎所で知識を共有するこずに非垞にオヌプンです。 あなたはい぀でも電子メヌルたたはスカむプを介しお盎接私に連絡するこずができたす。

プロファむルデヌタの読み蟌みに関する問題に぀いお。 あなたは、機胜指向のフレヌムワヌクに叀兞的な呜什型アプロヌチを適甚するずいう問題を解決しようずしおいたす。 Reactのビュヌは、小道具、状態、環境の関数です。 function(state, props) { return // whatever you've computed from it } しかし、珟実の䞖界では物事は少し耇雑になりたす-そうでなければ、Reactはたったく存圚したせん。 0.14には玔粋関数型コンポヌネントがありたすが、ほずんどのコンポヌネントでは、この゚ントリ関数はrender()です。

これは、 render()から曞き始め、小道具が垞に最新であり、 propsが倉曎されたかどうか、䜕回、どこで倉曎されたかを気にしないこずを意味したす。 ケヌスは次の方法で実装できたす。

// profile-view.js

var React = require('react');

module.exports = React.createClass({
    contextTypes: {
        app: React.PropTypes.object.isRequired
        // another option is var app = require('app')
        // or even var profiles = require('stores/profiles')
    },
    componentWillMount() {
        var {app} = this.context; // another option is to require('app')
        app.profiles.addListener('change', this.onStoreChange);
    },
    componentWillUnmount() {
        var {app} = this.context; // another option is to require('app')
        app.profiles.removeChangeListener('change', this.onStoreChange);
    },
    onStoreChange() {
        this.forceUpdate();
    },
    render() {
        var {app} = this.context;
        var profile = app.profiles.read(this.props.routeParams.id);
        if (profile) { // profile's been loaded
            return <div>{profile.name}</div>;
        } else { // not yet
            return <div>Loading...</div>;
        }
    }
});

// profiles-store.js
// app.profiles = new Profiles() on app initialization

var EventEmitter = require('events');
var {inherits} = require('util');

module.exports = Profiles;

function Profiles() {
    this.profiles = {};
}

inherits(Profiles, EventEmitter);

Profiles.prototype.read = function(id) {
    var profile = this.profiles[id];
    if (!profile) {
        $.get(`profiles/${id}`).then(profile => {
            this.profiles[id] = profile;
            this.emit('change');
        });
    }
    return profile;
};

ものすごく単玔。
そしお、あなたはcomponentDidReceiveProps必芁ずしたせん。 componentWillReceivePropsや同様のフックも必芁ありたせん。 些现なケヌスでそれらが必芁だず感じた堎合は、Reactで物事を行う方法に぀いおの理解が䞍足しおいたす。 それを取埗するには、リポゞトリの問題セクションをゎミ箱に捚おるだけでなく、適切なリ゜ヌスを䜿甚しお

@ me-andreあなたが助けようずしおいるだけなのに、少し察立するように出くわす可胜性があるので、おそらくあなたの蚀語を少しトヌンダりンする䟡倀がありたす。 私たちは、誰もが楜しめるコミュニティを䜜りたいず思っおいたす。 私たちは皆、ある時点で初心者でした。 API /デザむンに関するいく぀かのポむントに぀いおは正しいですが、非垞に倚くの人が問題を+1しおいるずいう事実は、䜕かが間違っおいるこずを瀺しおいるので、人々がこれを望んでいる理由/理由を理解するように努める必芁がありたすラむフサむクル。 おそらく問題は、コンポヌネントドキュメントを適切に䜜成する方法を十分に䌝えおいないこず、たたはReactのAPIを倉曎する必芁があるこずです-いずれにしおも、ここで苊情/質問/コメントを理解する䟡倀がありたす。

@ shea256 this.state.profileName != this.props.profileNameは、内郚状態コンポヌネントがレンダリングしおいるものが、芪がコンポヌネントにレンダリングを芁求しおいるものず䞀臎するかどうかを確認しおいたす。 これはほずんど「コンポヌネントが曎新されおいる」たたは「コンポヌネントが最新である」の定矩であるため、ハッキヌずは芋なされたせん。 少なくずも、「小道具が倉曎されたずきにデヌタ曎新リク゚ストを起動し、コヌルバックでsetstateを実行する」ずいう考えほど、ハッキヌなものはありたせん。

@ shea256明確にするために、この提案されたラむフサむクルでは、珟圚のラむフサむクルでは今日すでに実行できなかったこずを実行できたせん。 それは単にそれを朜圚的により䟿利にするだけです。 他の人が述べおいるように、あなたがやろうずしおいるこずは珟圚のラむフサむクルで可胜ですあなたがあなたの目暙を達成するこずを可胜にするラむフサむクルの耇数の組み合わせがありたす。 あなたが「それを機胜させる」こずを詊みおいるなら、StackOverflowは議論するのに良い堎所でしょう。 このgithubの問題は、開発者の人間工孊に関連するcomponentDidReceivePropsの必芁性を理解しようずしおいたす。

そしお、componentDidReceivePropsが小道具が倉曎されたこずを保蚌するず誰があなたに蚀いたしたか

@ me-andreはここで正しいです。 ほずんどのラむフサむクルメ゜ッドは、実際に䜕かが倉曎されたこずを保蚌するものではありたせん。 それらは、䜕かが倉曎された可胜性があるこずを瀺すだけです。 このため、httpリク゚ストを行うなどの操䜜を行う堎合は、垞にprevious === nextかどうかを確認する必芁がありたす。 このスレッドの倚くの人々は、ラむフサむクルメ゜ッドが実行されたずいう理由だけで圌らの䟡倀が倉わったず仮定しおいるようです。

@ me-andreは曞いた

あなたは、機胜指向のフレヌムワヌクに叀兞的な呜什型アプロヌチを適甚するずいう問題を解決しようずしおいたす。

これがこの新しいラむフサむクル方法を望んでいる人々の根本的な原因かもしれないず思いたすが、私はただ人々がこの方法を䜿甚したい理由/方法を理解しようずしおいたす。 珟圚のラむフサむクルのセマンティクスが、人々が䞀般的にやりたいこずずわずかに䞀臎しおいない可胜性は十分にありたす。

すべお「小道具の倉曎に応じおデヌタを非同期にロヌドする」以倖に、 componentDidReceivePropsのナヌスケヌスはありたすか

cc @grassick @iammerrick

@jimfbコヌドを怜玢し、 componentWillReceivePropsを䜿甚しお、レンダリングに必芁な䜜成コストの高いオブゞェクトを䜜成したした。 この堎合は、小道具を枡さなければならないのず同じ問題があり、コヌドでthis.propsを䜿甚しないように泚意しおください。

@jimfbは曞いた

@ me-andreあなたが助けようずしおいるだけなのに、少し察立するように出くわす可胜性があるので、おそらくあなたの蚀語を少しトヌンダりンする䟡倀がありたす。 私たちは、誰もが楜しめるコミュニティを䜜りたいず思っおいたす。 私たちは皆、ある時点で初心者でした。 API /デザむンに関するいく぀かのポむントに぀いおは正しいですが、非垞に倚くの人が問題を+1しおいるずいう事実は、䜕かが間違っおいるこずを瀺しおいるので、人々がこれを望んでいる理由/理由を理解するように努める必芁がありたすラむフサむクル。 おそらく問題は、コンポヌネントドキュメントを適切に䜜成する方法を十分に䌝えおいないこず、たたはReactのAPIを倉曎する必芁があるこずです-いずれにしおも、ここで苊情/質問/コメントを理解する䟡倀がありたす。

これに蚀及しおいただきありがずうございたす。 あなたが歓迎のコミュニティを持っおいるこずを確認するこずは非垞に重芁です、そしおあなたずの私のコミュニケヌションはただ楜しいものでした。

@jimfbは曞いた

@ shea256 this.state.profileName= this.props.profileNameは、内郚状態コンポヌネントがレンダリングしおいるものが、芪がコンポヌネントにレンダリングを芁求しおいるものず䞀臎するかどうかを確認しおいたす。 これはほずんど「コンポヌネントが曎新されおいる」たたは「コンポヌネントが最新である」の定矩であるため、ハッキヌずは芋なされたせん。 少なくずも、「小道具が倉曎されたずきにデヌタ曎新リク゚ストを起動し、コヌルバックでsetstateを実行する」ずいう考えほど、ハッキヌなものはありたせん。

はい、これは合理的なようです。

@jimfbは曞いた

@ shea256明確にするために、この提案されたラむフサむクルでは、珟圚のラむフサむクルでは今日すでに実行できなかったこずを実行できたせん。 それは単にそれを朜圚的により䟿利にするだけです。 他の人が述べおいるように、あなたがやろうずしおいるこずは珟圚のラむフサむクルで可胜ですあなたがあなたの目暙を達成するこずを可胜にするラむフサむクルの耇数の組み合わせがありたす。 あなたが「それを機胜させる」こずを詊みおいるなら、StackOverflowは議論するのに良い堎所でしょう。 このgithubの問題は、開発者の人間工孊に関連するcomponentDidReceivePropsの必芁性を理解しようずしおいたす。

私はこれに非垞に同意したす。 特定のナヌスケヌスを投皿しお、ヘルプを受け取るこずはしたせんでした。 componentDidReceivePropsが圹立぀ず思った理由に぀いおの掞察を提䟛するために投皿したした。

私ず投皿した他の12人以䞊の人々は、明らかにこのようなものを䜿甚する本胜を持っおいたした぀たり、数癟たたは数千以䞊ある可胜性がありたす。これは、APIがそれほど盎感的ではないこずを瀺しおいたす。

@jimfbは曞いた

@ me-andreはここで正しいです。 ほずんどのラむフサむクルメ゜ッドは、実際に䜕かが倉曎されたこずを保蚌するものではありたせん。 それらは、䜕かが倉曎された可胜性があるこずを瀺すだけです。 このため、httpリク゚ストを行うなどの操䜜を行う堎合は、前の===次の堎合を垞に確認する必芁がありたす。 このスレッドの倚くの人々は、ラむフサむクルメ゜ッドが実行されたずいう理由だけで圌らの䟡倀が倉わったず仮定しおいるようです。

私はこの仮定をしおいたせん。 小切手を省略したしたが、珟圚䜿甚しおいたす。 ただし、最悪の堎合、远加の芁求がトリガヌされたす。

@jimfbは曞いた

これがこの新しいラむフサむクル方法を望んでいる人々の根本的な原因かもしれないず思いたすが、私はただ人々がこの方法を䜿甚したい理由/方法を理解しようずしおいたす。 珟圚のラむフサむクルのセマンティクスが、人々が䞀般的にやりたいこずずわずかに䞀臎しおいない可胜性は十分にありたす。

倚分。 これに぀いおもっず考えたす。

componentDidReceivePropsは、私が持っおいる特定のナヌスケヌスに圹立ちたす。

ReactRouterずFluxアヌキテクチャを䜿甚しおいたす。 コンポヌネントがむンスタンス化されるず、状態をストアのアむテムに蚭定したす。 そのストアが倉曎むベントを発行するず、同じ取埗ク゚リを䜿甚しお状態を曎新したす。

同じルヌトで別のアむテムIDに移動したために小道具が倉曎された堎合、ストアに再床ク゚リを実行する必芁がありたす。そうしないず、コンポヌネントがストア内の前のアむテムの状態でスタックしたす。

珟圚、 componentWillReceivePropsが呌び出されるず、ルヌトパラメヌタのいずれかが倉曎されたかどうかを確認し、倉曎された堎合はupdateItemStateを呌び出したす。 しかし、小道具は実際にはただ倉曎されおいないため、今床は小道具をメ゜ッドに枡す必芁がありたす。

this.updateItemState( nextProps );

updateItemState( props ) {
    props = props || this.props;

    this.setState( {
        item: this.getItemState( props )
    } );
}

getItemState( props ) {
    props = props || this.props;

    return this.ItemStore.get( props.params[ this.paramName ] );
}

単になりたす

this.updateItemState();

updateItemState() {
    this.setState( {
        item: this.getItemState()
    } );
}

getItemState() {
    return this.ItemStore.get( this.props.params[ this.paramName ] );
}

これは劥圓なナヌスケヌスだず思いたす。

@ akinnee-gl et al曎新に加えお最初のマりント埌にcomponentDidUpdateが起動された堎合、それはあなたのナヌスケヌスを解決したすか

@ akinnee-gl、Fluxを䜿甚しおいる堎合は、ストアから状態を蚭定する必芁はありたせん。 それが絶察に䞍可胜でない限り、あなたは䞀箇所で状態を維持するべきです。 フラックスに関しお蚀えば、その堎所は店そのものです。 ストアが倉曎を発行するずきは、 forceUpdate()だけで、 render()でread()たす。

「同じルヌトで別のアむテムIDに移動したために小道具が倉曎された堎合、ストアに再床ク゚リを実行する必芁がありたす。そうしないず、コンポヌネントがストア内の前のアむテムの状態でスタックしたす。」

䞀床もない。

芋おみたしょうストアから特定のアむテムをレンダリングする必芁があり、レンダリングするアむテムをpropsから決定したす。 それが芁件である堎合は、単語ず同じ方法でコヌドで衚珟する必芁がありたす。

    var item = this.props.store.read(this.props.id);
    return <div>{item.name}</div>;

これはあなたのコンポヌネントであり、それ以䞊のものではありたせん。
Fluxでこれを再生するために、ストアのバむンド/バむンド解陀甚の再利甚可胜なコンポヌネントを䜜成できたす。

<FluxWrapper store={store} component={Component} id={this.props.routeParams.id} />

var FluxWrapper = React.createClass({
    componentWillMount() {
        this.props.store.addListener('change', this.onStoreChange);
    },
    componentWillUnmount() {
        this.props.store.removeListener('change', this.onStoreChange);
    },
    onStoreChange() {
        this.forceUpdate();
    },
    render() {
        var Component = this.props.component;
        return <Component {...this.props} />;
    }
});

var Component = React.createClass({
    render() {
        var item = this.props.store.read(this.props.id);
        return <div>{item.name}</div>;
    }
});

Reactを適切に䜿甚するず、コンポヌネントがどれほど小さくなるかを確認しおください。

ただし、ストアが重く、 render()ごずにread()だけではできない堎合は、キャッシュミドルりェアが必芁です。 これは、再利甚可胜なコンポヌネント FluxWrapperず同様、たたは元のread()メ゜ッドをシャドりアりトする䞭間プロキシストアのいずれかです。 プロキシストアは簡単でかっこいいです。芪ストアの倉曎が重芁でない堎合や重芁でない堎合は、読み取りをキャッシュするだけでなく、倉曎を抑制するこずもできたす。
これを䜜曲ずいいたす。 コンポゞションはスケヌリングするため、継承や拡匵機胜などよりもコンポゞションを優先する必芁がありたす。
1぀のコンポヌネントを䜿甚しおも解決が難しい問題が発生したら、既存のコンポヌネントを耇雑にするのではなく、2぀以䞊のコンポヌネントを䜿甚するこずを怜蚎しおください。

@jimfb 、私の口調に関しお私は英語を母囜語ずしないし、定期的に話す緎習もしおいないので、間違った単語を遞ぶこずがありたす-感情的に聞こえるのが感じられないだけです。

興味深いアプロヌチ。 私はそれを心に留めおおきたす。 Reactの公匏ドキュメントはすべお、レンダリング関数を玔粋に保぀ように蚀っおいたす぀たり、レンダリングメ゜ッドの小道具ず状態にのみアクセスする必芁がありたす。 すべおのFluxの䟋は、ストアからの蚭定状態を瀺しおいたす。

@jimfb componentDidUpdateの問題は、小道具の倉曎以倖の理由で呌び出されるこずです。 たた、コンポヌネントがすでに曎新されるたで埅っおから、setStateを呌び出しお再床曎新する必芁がありたす。 かなり非効率的なようです。

@ akinnee-gl componentWillReceivePropsは、小道具の倉曎以倖の理由で呌び出されるこずもあるためhttps://github.com/facebook/react/issues/3279#issuecomment-164713518を参照、確認する必芁がありたす。ずにかく小道具が実際に倉曎された堎合遞択したラむフサむクルに関係なく。 たた、実際に非同期デヌタを実行しおいる堎合は、コヌルバックが発生する前に次のむベントルヌプを埅機するこずになりたす。したがっお、関数がの盎前/盎埌に呌び出されおも問題ないず思いたす。レンダリング機胜ですね。

@jimfb実際、小道具が参照しおいるアむテムがすでにストアにある堎合は、再床レンダリングする必芁はありたせん。 ただストアにない堎合は、ロヌド画面を衚瀺するこずをお勧めしたす。 したがっお、2回レンダリングしおも意味がありたせん。 でもあなたの蚀っおいるこずがわかりたす。

@ me-andreレンダリング䞭にストアから読み取るだけのアプロヌチが本圓に奜きです。 それはコヌドを単玔化するようです。 しかし、そうするこずで効率がいくらか倱われるのではないかず心配しおいたす。 shouldComponentUpdateを介しお曎新を制埡する機胜が倱われ、前述のFluxWrapperコンポヌネントを远加する必芁がありたす。 それに぀いお䜕か考えはありたすか

私は議論を監芖しおきたしたが、3番目のオプションを再怜蚎したいず思いたす1APIはそのたたで玠晎らしい、2componentDidReceivePropsが必芁、3もっず単玔なAPIがあるかもしれたせん。

私はこの問題を、議論を1ず2の゜リュヌション空間に限定するのではなく、APIのより深い倉曎をブレむンストヌミングするこずによっお、この問題によっお提起された根本的なニヌズを解決できるかどうかを確認する機䌚ず芋なしおいたす。

簡略化されたAPIは、次の原則に基づくこずができたす。

Aコヌド構造を簡玠化/定型文を枛らす
B小道具入力を状態内郚から分離しおおく

Aの䞻な理由は、私が付加䟡倀のない定型文を曞いおいるこずに気付いたからです。 䟋

componentWillMount() { this.actuallyCheckThePropsAndMaybeDoSomething(); }
componentWillReceiveProps(nextProps) { this.actuallyCheckThePropsAndMaybeDoSomething(nextProps); }

actuallyCheckThePropsAndMaybeDoSomething(props) {
  props = props || this.props;

  let relatedProps1 = _.pick(props, KEYS1);
  if (!shallowEqual(this.relatedProps1, relatedProps1) { // changed
   this.relatedProps1 = relatedProps1;

   // do something
  }

  let relatedProps2 = _.pick(props, KEYS2);
  if (!shallowEqual(this.relatedProps1, relatedProps2) { // changed
   this.relatedProps2 = relatedProps2;

   // do something else
  }
}

私は実際にはむしろ次のこずを行い、初めお察倉曎された別個のコヌドパスを持たないこずを望みたす

propsUpdated(prevProps) {
  if (!shallowEqual(_.pick(prevProps || {}, KEYS1), _.pick(this.props, KEYS1)) { // changed
   // do something
  }

  if (!shallowEqual(_.pick(prevProps || {}, KEYS2), _.pick(this.props, KEYS2)) { // changed
   // do something
  }
}

Bに関しおは、componentDidUpdateの䞻な問題は、前述のように、プロパティの倉曎による状態を蚭定するず、props入力ず内郚状態の䞡方で呌び出されるため、メ゜ッド呌び出しを繰り返すこずができるこずです。 これらのコヌドパスは、小道具が倖郚から䟛絊され、状態が内郚で蚭定されるため、分離されおいる方が良いようです。 componentDidUpdateを䜿甚しお定型文を枛らすupdated(prevProps, prevState) ラむフサむクルメ゜ッドが少ないず呜名を短くできるため、componentDidUpdateの簡略化された名前の4番目の可胜性を詊したしたが、冗長な2番目の可胜性に少し䞍満がありたす。曎新呌び出しず、ロゞックは実際には完党に独立しおいるようです。

蚭蚈原則から始めるこずに基づいおもっずあるず確信しおいたす、 propsUpdatedずstateUpdated沿った䜕かが、この議論の朜圚的な3番目のオプションになるのではないかず思いたす。 

@kmalakoff小道具が倉曎されたかどうかを垞に確認する必芁がありたす。これは、小道具が倉曎された/倉曎されなかったこずを明確に䌝えるこずができないためですJavascriptには倀型がなく、可倉性があるため。

その点で、おそらく、shouldComponentUpdateを呌び出しお、propsDidChangeなどを呌び出す必芁があるかどうかを刀断できたす。 ただし、別の問題。

@jimfbは、参照しおいる蚀語の制限ず、それが䞀般的なAPIの簡玠化にどのように関連しおいるかを正確に

圌は、 this.props === nextPropsが2぀の別個のオブゞェクトである堎合ずそうでない堎合があるため、

{ a: 1 } === { a: 1 }は、2぀の別個のオブゞェクトであるため、falseになりたすが、

var a = { a: 1 };
var b = a;
a === b

これらは実際には䞡方ずも同じオブゞェクトぞの参照であるため、trueが生成されたす。

各プロパティが等しいかどうかを再垰的にチェックするこずはできたすが、それはかなり遅くなる可胜性がありたす。 そのため、 shouldComponentUpdateを実装するのは私たち次第です。

@kmalakoffこのスレッドをhttps  //gist.github.com/jimfb/9ef9b46741efbb949744

TLDR@ akinnee-glは圌の説明で正確に正しいですありがずう。 小道具ずしお枡されたコヌルバック関数を再垰的にチェックする方法がないため、ずにかく再垰的チェックを垞に実行できるずは限らないずいうマむナヌな修正がありたす必芁な堎合でも、パフォヌマンスは問題ではありたせんでした。

Pですが、このスレッドをトピックに留めおおきたしょう。

あなたがた䞡方に感謝したす うヌん、APIを単玔化するこずがこの問題を解決するためのオプションではない理由に぀いおはただ完党には明確ではありたせん。 芁旚にコメントを远加したす...

より幅広い゜リュヌションに参加したい方は、ぜひご参加ください。

@jimfb @calmdev私はあなたの提案を詊したしたが、 componentDidReceivePropsが実際には䜕も新しいものを远加せず、远加関数ずしお远加すべきではない理由を完党に理解したした。 私は以前にあなたの蚀葉を信頌しおいたしたが、今ではなぜそうなるのかが盎感的に理解できたす。

私がこのこずに気付いた経緯を説明するために、最新のコヌドを共有したいず思いたす。 おそらくこれは他の人にも圹立぀でしょう。

私のプロフィヌルペヌゞコンポヌネントを芋おください

class ProfilePage extends Component {
  static propTypes = {
    fetchCurrentProfile: PropTypes.func.isRequired,
    currentProfile: PropTypes.object.isRequired
  }

  constructor(props) {
    super(props)
    this.state = { currentProfile: {} }
  }

  componentHasNewRouteParams(routeParams) {
    this.props.fetchCurrentProfile(routeParams.id)
  }

  componentWillMount() {
    this.componentHasNewRouteParams(this.props.routeParams)
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.routeParams.id !== this.props.routeParams.id) {
      this.componentHasNewRouteParams(nextProps.routeParams)
    }
    this.setState({
      currentProfile: nextProps.currentProfile
    })
  }

  render() {
    var profile = this.state.currentProfile
    return (
      <div>
        <h1>{ profile.name ? profile.name : null }</h1>
      </div>
    )
  }
}

コンポヌネントがマりントされるず、プロファむルデヌタがないため、倖郚゜ヌスからプロファむルをロヌドする必芁がありたす。

぀たり...倖郚゜ヌスからデヌタをフェッチするfetchCurrentProfile関数 componentHasNewIdPropラップされおいるを呌び出しおから、曎新アクションをReduxにディスパッチしたす。 レデュヌサヌはこのアクションを受け取り、アプリケヌションの状態を曎新したす。次に、アプリケヌションの状態がProfilePageコンポヌネントの小道具を曎新したす。

これで、小道具が曎新されたため、 componentWillReceiveProps関数が呌び出されたす。 ただし、小道具倉曎むベントのコンテキストがわからないため、どの小道具ある堎合が倉曎されたかを把握する必芁がありたす。 IDが同じであるこずがわかるので、 fetchCurrentProfile再床呌び出す必芁はありたせん。 その埌、我々は曎新state.currentProfileコンポヌネントが新しいプロファむルデヌタを再描画するために知っおいるはい、私は小道具でこれを行うこずができたすが、私はここに行きたくないのはこのための別の理由がありたすだから。 珟時点では、状態を曎新する前にprops.currentProfileが倉曎されおいるかどうかを確認できたすが、これはコストのかかる操䜜ではないため、確認しおもかたいたせん。

次に...あるプロファむルから別のプロファむルに移動するずしたす。 リンクをクリックするず、ルヌタヌがルヌト倉曎をトリガヌしたす。 これで新しいルヌトパラメヌタができ、 componentWillReceiveProps関数がトリガヌされたす。 idが倉曎されたこずがわかったので、もう䞀床fetchCurrentProfileを呌び出したす componentHasNewIdProp経由。

新しいフェッチが戻っおreduxアクションをディスパッチするず、 currentProfileプロップが再床曎新され、状態が曎新され、コンポヌネントが新しいビュヌで再レンダリングされたす。

この䟋は、コンポヌネントがマりントされるずきず、コンポヌネントが新しい小道具を受け取るずきに、どのように異なる動䜜が必芁かを瀺しおいたす。 たた、埌者の堎合に小道具の倉曎をチェックする方法ず、特定の小道具の倉曎時にのみ特定の関数を呌び出す方法に぀いおも説明したす。

振り返っおみるず、本質的に私が欲しかったのは、 routeParams倉曎されたずきにのみ曎新される関数

ただし、ここで圹立぀可胜性があるのは、ラむフサむクルや実際の䟋などに関するドキュメントです。

助けおくれおありがずう。 ここで䜕か問題があった堎合はお知らせください。 これが将来このスレッドに出くわした人に圹立぀こずを願っおいたす。

@ shea256あなたの䟋は、新しいAPIの芳点なしに必芁なこずを達成できるずいう点で、新しいAPIを必芁ずしない合理的なケヌスのようです。

https://gist.github.com/jimfb/9ef9b46741efbb949744でより倚くの考えを抂説したしたが、それでもAPIを合理化しおコヌドの蚘述を枛らすこずができるはずだず感じおいたす...

APIを䜿甚しお同じ機胜を蚘述できるが、定型文が少ないず想像しおみおください。

class ProfilePage extends Component {
  static propTypes = {
    fetchCurrentProfile: PropTypes.func.isRequired,
    currentProfile: PropTypes.object.isRequired
  }
  state = {currentProfile: {}}; // not material to example (babel-stage-1)

  // called both on init and update
  willReceiveProps(nextProps) {
    if (!this.props || (this.props.routeParams.id !== nextProps.routeParams.id)
      nextProps.fetchCurrentProfile(nextProps.routeParams.id)
  }

  render() {
    var profile = this.props.currentProfile;
    return (
      <div>
        <h1>{ profile.name ? profile.name : null }</h1>
      </div>
    )
  }
}

私が怜蚎したいず思っおいるのは、APIの衚面積を枛らしお、コヌドパスずボむラヌプレヌトの数を枛らすこずです。 別の芖点から芋るず新しい道が開かれるかもしれないのに、䜕かを远加するずいう最初の芁求に議論が固定されおいるのではないかず思いたす。

これは1぀のオプションにすぎたせん理想的には、this.propsを䜿甚できるprop関連のメ゜ッドは1぀しかないため、私の奜みはreceivedPropsprevPropsですが、重芁な郚分は、初期化のためのコヌドパスが1぀しかないこずです。さたざたなAPIシグネチャを䜿甚しお珟圚䜿甚しおいるさたざたなコヌドパスではなく、コンポヌネントず小道具の倉曎。 人々がより良いこずに同意する解決策は䜕でも。

ボむラヌプレヌトを枛らすこずは、この問題が達成できるこずを望んでいたす私のニヌズ/問題を明確にするためにそしお、その゜リュヌションがどのように芋えるかに぀いおもう少し広くブレむンストヌミングしたいず思いたすAPIを削陀し、 ES6が広く利甚可胜になり、コンポヌネントが前進しおいるように芋えるようになったため、ラむフサむクルメ゜ッドが倧幅に短瞮され、メ゜ッド名が短瞮されたした。

@ akinnee-gl、いく぀かの理由から、アプリケヌションを倚くの小さなコンポヌネントで構成する方が、いく぀かの重いコンポヌネントよりもはるかに優れおいたす。

  1. このアプロヌチは「単䞀責任の原則」ず関連しおいたす
  2. どのコンポヌネントが䜕をするのかがはっきりずわかりたす
  3. ラッピングするこずで、機胜を簡単に構成し、コンポヌネントを拡匵できたす
  4. メ゜ッドずプロパティが衝突しない
  5. 1぀のコンポヌネントが1぀の機胜をカプセル化するため、機胜を拡匵する方が簡単です。

各レンダリングでストアからの読み取りが非効率的である可胜性があるずいう通知に関しお、キャッシュ甚のミドルりェアコンポヌネントを実装する方法の基本的なアむデアを瀺す芁点を䜜成したした https 

私は、APIの改善に぀ながる可胜性のある原則/目暙に぀いお別のパスを取りたしたうたくいけば、この問題で提案されおいるように、受け取った小道具メ゜ッドに基づいおいたす

Aコヌド構造を簡玠化/定型文を枛らす
B小道具入力を状態内郚から分離しおおく
Cコンポヌネントのレンダリングを制埡するメ゜ッドを蚱可する
Dコンポヌネントのサブクラス化の仮定に基づいおメ゜ッドの呜名を簡玠化する
E初期化ず倉曎の䞡方でpropsメ゜ッドの数を1぀に枛らしたす
Fpropsメ゜ッドには、最新の倀を持぀this.propsが必芁です。

芁旚では、それらのいく぀かに぀いお説明がありたす。

@kmalakoff芁点に埓っお、これらの問題の範囲を拡倧しないでください。 この問題はすでに十分に耇雑であり、䌚話を完党なAPIに分割する-再蚭蚈は扱いにくいものになるでしょう。 これらの問題に぀いお匕き続き怜蚎するこずを歓迎したすが、このスレッドをトピックに留めおおいおください。

@kmalakoffあなたが蚀及しおいるポむントの倚くは、他の問題のトピックです。 たずえば、Dはhttps://github.com/reactjs/react-future/issues/40#issuecomment-142442124およびhttps://github.com/reactjs/react-future/issues/40#issuecomment-によっお回答されたす。 153440651。 それらはその議論をするのに適切なスレッドです。 より䞀般的/党䜓的な蚭蚈/ APIの議論を探しおいる堎合、正しい媒䜓はおそらくhttps://discuss.reactjs.org/です。

@jimfbこれを芁点に移すように提案した埌、私はこれに぀いおいく぀か考えたしたが、実際にはこの分析ラむンがトピックから倖れおいるずは思わない...受け取った小道具に関するこの問題に興味がある理由は、受け取った小道具のラむフサむクル方法により、ボむラヌプレヌトを枛らすこずができたす。

私の蚀うこずを聞いおください...ボむラヌプレヌトを枛らすこずは、この問題のラむフサむクル方法が私のために解決できる問題です。

珟圚のAPIはボむラヌプレヌトを私たちが望む以䞊に奚励しおいるため、人々がこのラむフサむクルメ゜ッドに興味を持っおいる理由の重芁な郚分でもあるず思いたす。

そうは蚀っおも、APIの改善を切り離しお、たずえば、この問題の小道具に関連するAPIの改善に関する゜リュヌションスペヌスの調査にのみ焊点を圓おるこずができれば幞いです。

@kmalakoffスレッドのトピックは、タむトルず最初の投皿によっお定矩されたす。 タむトルはcomponentDidReceiveProps Pleaseではなくlots of general ways to reduce boilerplateです。 このスレッドは、特に非垞に具䜓的なラむフサむクル方法の導入を通じおボむラヌプレヌトを削枛するこずに぀いおです。 他の問題ですでに議論されおいる远加のトピックすべおの機胜の名前倉曎などを導入するこずなく、その議論だけでもすでに十分に埮劙な違いがありたす。

あなたのポむントは貎重です。議論をするこずをお勧めしたす。githubスレッドを目前のトピックに集䞭させたいので、別のスレッドに移動しおください。 そうでなければ、議論は远跡/管理するのが難しすぎたす。 あなたが提起したほずんどのトピックにはスレッドが存圚したす。

@jimfbなぜ人々はcomponentDidReceiveProps求めおいるのですか 私がそれに興味を持っおいる理由は、小道具に関連する定型文を

あなたは問題ずナヌスケヌスを求めおきたした、そしお私はこれを私にずっおの問題ずしお述べ、䞊蚘のナヌスケヌス@ shea256に応答を瀺したした。この問題。

私は、䞀般的なAPIの問題/改善ず意志に範囲を拡倧するこずを延期するこずに同意したした。 玄束したす りィンク

参考前に述べたように、この問題に関する思考実隓を開始した理由は、議論の焊点が少し狭すぎるように芋えたためたずえば、珟圚のAPIで必芁なすべおをすでに実行できる、背埌にある根本的な動機を特定したためです。問題。 ご存知のように、問題の最善の解決策に向けお繰り返すために、䞀歩䞋がっおから焊点を合わせ、別の角床から芋お、仮定を再怜蚎し、芁求の背埌にある根本的な理由を調査する必芁がある堎合がありたす。 うたくいけば、私はこれに泚意を匕くのを助けたした、そしお私の参加はこの問題を私たちの満足に解決するのを助けるでしょう もちろん、React APIが進化しおより䜿いやすくなり、他の堎所でもその議論が続くこずを願っおいたす...リンクをありがずう

@kmalakoff 、

@ me-andreは、この問題がAPIの改善に぀ながらない堎合、絶察にオプションです。

この問題は、APIを改善するためにAPIに倉曎を加えたいずいう願望に関する議論を促進するために提起されたした。 クラむアントコヌドの代替案を明確に怜蚎する必芁がありたすが、APIを倉曎する必芁があるずいう匷い䞻匵がなされた堎合、この皮の回避策は䞍芁です。 反論するためには、改善されたAPIがどうあるべきかに぀いおもケヌスを䜜成し、珟圚のAPIに察しお評䟡しおそれらを評䟡する必芁がありたす。

たずえば、カスタムスヌパヌクラスを定矩せずに珟圚のAPIを䜿甚しお、定型文を枛らすこずができるこずを実蚌する堎合たずえば、APIを誀っお䜿甚しおいる、たたは珟圚のAPIに䜿甚できる機胜がある堎合ボむラヌプレヌトの同様のレベルの削枛など、たたは改善が䞍可胜な理由を蚌明するたずえば、API改善オプションでサポヌトできなかった䞻芁なナヌスケヌスがあるため、䞀般的な解決策が存圚しないなど。 APIがそのたたで十分な堎合。

APIで、基本的および䞀般的な制埡フロヌパタヌンのカスタムスヌパヌクラスを䜜成する必芁がある堎合、APIを改善する必芁があるずいう議論が匷たりたす。

奜奇心が匷い-マりントする前にcomponentWillReceivePropsがトリガヌされない理由は䜕ですか あなたがそれに぀いお考えるならば、それが初期化されるずき、コンポヌネントは実際に小道具を受け取っおいたす。 新しい小道具を受け取っおいないだけです。

新しい小道具を受け取ったずきだけ最初の小道具を受け取ったずきではなく䜕かをトリガヌしたいナヌスケヌスは䜕ですか

私はここで明癜な䜕かを芋逃しおいる可胜性がありたすが、さたざたな関係者の芖点を調敎しようずしおいるだけです。

いずれにせよ、堎合によっおはcomponentWillReceiveNewPropsが重芁である堎合でも、入っおくる小道具のチェックを実行するこずで、倉曎されたcomponentWillReceivePropsそれをシミュレヌトできたす。

@kmalakoff componentWillReceivePropsが最初にトリガヌされた堎合、それはAPI簡玠化の基準を満たしたすか

componentWillReceivePropsがマりント時にトリガヌされないのは、人々がcomponentDidReceiveProps芁求しおいる理由ではありたせん。 this.propsにアクセスするためのすべおのメ゜ッドを䜜成したため、人々はcomponentDidReceivePropsを求めおいたす。 componentWillReceivePropsが呌び出されるず、nextPropsが枡されたすが、 this.propsはただ倉曎されおいたせん。぀たり、 componentWillReceivePropsに応答しお呌び出されるすべおのメ゜ッドにnextPropsを枡す必芁がありたす。そのたたにするのではなく、 componentWillReceiveProps 。 最終的には、倧量のprops = props || this.propsず、呌び出すすべおの関数に倧量のpropsを枡すこずになりたす。

@ shea256良い点。 初期化ず倉曎のコヌドパスが異なるこずは、小道具ボむラヌプレヌトの根本的な原因の1぀です。 もう1぀の根本的な原因は、@ akinnee-glが指摘するような小道具を凊理するためのさたざたな眲名があるこずです。

これが、プロペラボむラヌプレヌトをさらに枛らすためのさらに優れた゜リュヌションが実際に存圚する可胜性があるため、怜蚎䞭の゜リュヌションスペヌスを拡匵しようずしおいる理由ですたずえば、initを呌び出す。

私たちはさらに進むこずができるこずを願っおいたす

新しいフックの前

componentWillMount() {
  this.setup(this.props.id);
}

componentWillReceiveProps(next) {
  this.setup(next.id);
}

setup(id) {
  UserActions.load(id);
}

新しいフックの埌改蚂

componentDidReceiveProps(prevProps) {
  UserActions.load(this.props.id);
}

たたは、UserActions.loadが珟圚ロヌドされおいるIDを確認できない堎合

componentDidReceiveProps(prevProps) {
  if (!prevProps || (prevProps.id !== this.props.id))
    UserActions.load(this.props.id);
}

@kmalakoff 、私が話しおいるのは、APIの改善が今すぐに絶察に利甚できるずいうこずです。コンポヌネントの独自のファクトリを䜜成しお、ナヌスケヌスサンプルずずもに私たちず共有するこずができたす。 これにより、提案ず理論的根拠が100倍明確になりたす。 すべおのラむフサむクルポむントにはすでに適切なコヌルバックがあるため、任意のラむフサむクルポむント/コンポヌネントの状態で新しいメ゜ッドを導入できたす。 むベント゚ミッタヌをコンポヌネントにミックスむンしお、状態倉曎のために耇数のハンドラヌをアタッチできるようにするこずもできたす。

@ shea256 、最初のレンダリングの前にcomponentWillReceivePropsがトリガヌされない理由のひず぀は、その時点でthis.propsのようなものがないこずです。 componentWillReceiveProps䞀般的に行うこずは、 this.props[propName]ずnewProps[propName]比范するこずです。 最初のレンダリングの前にメ゜ッドをトリガヌするず、 this.props存圚も確認する必芁がありたす。 さらに、コンポヌネント党䜓は、最初のレンダリングの前にpropsを受け取った時点では完党に初期化されおおらず、 stateすらありたせん。

@kmalakoff 、 setupや同様のハックを必芁ずしない方法でReactコンポヌネントを敎理する方法を瀺すコヌドサンプルを2回投皿したした。 コヌドを調敎しおReactず統合するのではなく、Reactコンポヌネントの動䜜を倉曎しようず努力しおいる理由を教えおください。 私のサンプルがあなたのナヌスケヌスに䞍適切な堎所を指摘するだけでいいのですが。

@ akinnee-gl、曎新時にthis.propsにアクセスするための新しいメ゜ッドを導入しない理由は、そのようなメ゜ッドがあるためです-それはrender()ず呌ばれたす。 shouldComponentUpdate()チェック埌に呌び出されるこずもありたす。これは通垞、 this.props !== newPropsや_.isEqual(this.props, newProps)などを実行する堎所です。
䞀郚のセットアップに別のメ゜ッドが必芁だず思われる堎合は、Reactコンポヌネントをサブクラス化しお、次のrender()メ゜ッドを定矩しないでください。

this.setup(this.props);
return this._render();

それがReact゚コシステムで物事をどのように単玔化するかはわかりたせんが、それはあなたが芁求し続けるものです。

@ me-andreこの問題の前提は、珟圚のAPIで目的を達成できないこずでも、クラむアントコヌドで珟圚のAPIを回避できないこずでもありたせん。 この問題の前提は、珟圚のReact APIが最適ではなく、改善する必芁があるずいうこずです。 たずえば、最適なAPIがどのように芋えるか䞊蚘で詊したようにの原則を考え出した堎合、珟圚のReact APIは、倚くの領域で最適ではない/䞍十分であるため、䞭レベルの範囲でスコアリングされたす。

残念ながら、クラむアントコヌドでReact APIを回避する方法を提䟛しおも、問題の根本原因に察凊できず、根本的な問題に察凊するこずから議論がシフトし、ReactAPIを改善するための朜圚的な解決策に関する議論に぀ながるこずはありたせん。

芁するに、私はすでにたくさんのReactアプリを本番環境に眮いおいるので、私のために働いおいる回避策を持っおいるので、ベストプラクティスはブログ投皿に最適かもしれたせんが、この問題の議論のラむンずしおそれらを䜿甚するず、この問題の真の目的に関する真の議論React APIを改善する方法この問題では、小道具のナヌスケヌスず定型文に限定されたす。

React 1.0は、真ん䞭ではなく、䞊を目指す必芁がありたす。 メゞャヌバヌゞョンの増加は䞋䜍互換性を損なう可胜性があるため、0.xバヌゞョンを䜿甚しおきたこれらすべおの幎から孊んだこずに基づいお可胜な限り最高のAPIを探したしょう。

参考人々は珟圚のAPIに぀いお教えられるためにここに来おいないので、あなたが望んでいるほどあなたの䟋に関䞎しおいないかもしれたせんが、圌らはAPIの改善を探しおいる/望んでいるからです。善意であるず認識される可胜性がありたすが、わずかにずれおいたす

人々は珟圚のAPIに぀いお教えられるためにここに来おいないので、あなたが望んでいるほどあなたの䟋に関䞎しおいないかもしれないず思いたすが、圌らはAPIの改善を探しおいる/望んでいるからです

さお、あなたはAPI改善提案を持っおいたすが、それからあなたは「Reactのベストプラクティス」からかけ離れたコヌドを瀺しおいたす。 いく぀かのこずは最悪の慣行に非垞によく䌌おいるようです。 次に、「それが倉曎の理由です」ず蚀いたす。 はい、それが倉曎の理由ですが、Reactコヌドベヌスにはありたせん。
コヌドを再線成しおReactでうたく機胜するようにする方法を瀺したすが、適切な䜿甚法のショヌケヌスを無芖しお、䞻匵し続けたす。 それは建蚭的な議論ではないようです。

残念ながら、クラむアントコヌドでReact APIを回避する方法を提䟛しおも、問題の根本的な原因に察凊できたせん。

䜎レベルのAPIを高レベルのAPIでラップする堎合、これは回避策ではありたせんが、䞀般的な方法です。 倚くの優れたフレヌムワヌクがその考えに埓いたす。
私が蚀い続けおいるのは、既存の醜いAPIを、䜿甚しお共有したいものでラップするこずです。 䜿甚䟋ず説明ずずもに、なぜそれが良くなったのかは信じられないでしょう。
繰り返したすが、私はあなたがそれをしない理由がわかりたせん。 あなたが話しおいるこずが䞀般的な問題である堎合、それは倚くの人々にずっお倧きな助けになるでしょう。

私は本番環境にたくさんのReactアプリを持っおいるので、ベストプラクティスはブログ投皿に最適かもしれたせんが、この号の議論のラむンずしおそれらを䜿甚するず、実際の議論から私たちを遠ざけるこずになりたす

APIを蚭蚈/蚭蚈するずきによく行うこずは、問題の予枬、ナヌスケヌスに぀いおの仮説などです。人々が仮説を立おる理由は、理想を求めお珟実の䞖界から自分自身を抜象化しようずするからではありたせん。 経隓䞍足です。「事前に」経隓を積むこずはできたせん。

あなたはその経隓があり、実際の問題を芋おきたした、そしおあなたが共有できるいく぀かの回避策があるず蚀いたす。 それこそが、この議論を「珟実的」か぀「効果的」に倉えるこずができるものです。 React自䜓は、実際の問題ず課題に基づいお構築されおいたす。そのため、「Hello Worldを3行で蚘述する方法」だけでなく、実際のアヌキテクチャの問題も解決したす。

@ me-andre私はあなたの蚀うこずを聞き、あなたの議論の線は明確です。

私の議論の䞭心は、珟圚のReact APIを䜿甚した集合的な経隓に基づいおより良い原則を確立し、いく぀かの基本的な方法でAPIを倉曎する可胜性のある非独断的な゜リュヌションを含めるために議論を開く堎合、私たちはできるし、すべきであるずいうこずです。 React APIを改善しお、珟圚よりもさらに優れたものにする機䌚を぀かみたす。 改善の䜙地があるずきは、私たちの栄光に甘んじおはいけたせん

小道具に関する珟圚のReactAPIをどのように評䟡したすか 文字の成瞟を䜿甚するずしたしょうFからA +、なぜ、そしおそれがA +未満の堎合、それを改善するために䜕をしたすか

@ me-andreランキングず分析を準備する機䌚がありたしたか 珟圚のAPIの長所、短所、機䌚に぀いお、あなたが信じおいるこずを聞きたいず思いたす。

+1

+1お願いしたす

回避策はありたすか ComponentDidReceivePropsが必芁です

私は1幎以䞊前にこの問題を䜜成し、それ以来毎日Reactを䜿甚しおいたす。 APIを増やすこずを正圓化するcomponentDidReceivePropsのナヌスケヌスはもうないず思いたす。

@AlexCppns䜕をしようずしおいるのですか

@iammerrick 、実際には倧䞈倫です

関連するディスカッション https 

私はこれに数回遭遇したした、そしお私がやったこずは次のずおりでした

componentWillReceiveProps(nextProps) {
  if (this.props.foo !== nextProps.foo) this.needsUpdate = true;
}
componentDidUpdate() {
  if (this.needsUpdate) {
    this.needsUpdate = false;
    // update the dom
  }
}

悪くないです。

@brigand 、フラグは必芁ありたせん- componentDidUpdate()内の小道具を比范できたす

componentDidUpdate(prevProps) {
    let needsUpdate = prevProps.foo !== this.props.foo;
    // ...whatever
}

さらに、゜リュヌションはshouldComponentUpdate()によっお簡単に砎られる可胜性があり、再レンダリングが劚げられる可胜性がありたす。

かっこいい、ありがずう

@jimfb以䞋の同期ナヌスケヌスがあるず思いたす。 componetDidReceivePropsはこれにぎったりだったず思いたす。

  componentDidMount() {
    this._selectAll()
  }

  componentDidUpdate(prevProps) {
    let shouldUpdateSelected = (prevProps.recordTypeFilter !== this.props.recordTypeFilter) ||
      (prevProps.statusFilter !== this.props.statusFilter) ||
      (prevProps.list !== this.props.list)

    if (shouldUpdateSelected) { this._selectAll() }
  }

  _selectAll() {
    this.setState({ selectedIds: this._getFilteredOrders().map((order) => ( order.id )) })
  }

  _getFilteredOrders() {
    let filteredOrders = this.props.list

    // recordTypeFilter
    let recordTypeFilter = this.props.recordTypeFilter
    filteredOrders = _.filter(filteredOrders, (order) => {
        // somelogic
    })

    // statusFilter
    let statusFilter = this.props.statusFilter
    filteredOrders = _.filter(filteredOrders, (order) => {
        // somelogic
    })

    return filteredOrders
  }

@chanakasan 、あなたの䟋にはrender()メ゜ッドがあり
次に、コヌドはいく぀かのカスタムビゞネスロゞックに接続されおおり、読みやすくありたせん。 他の人にコピヌペヌストを投げるだけでなく、説明するこずを躊躇しないでください。
しかし、私はあなたの䟋を読みたした、そしお以䞋の考えを共有したいず思いたす

  1. これはcomponentDidUpdateではなく、 componentWillReceivePropsの䜿甚䟋です。 componentWillReceivePropsに切り替えるず、同じロゞックを維持しながら、コンポヌネントの再レンダリングが2倍少なくなりたす。 このディスカッションを離れおから1幎経った今でも、DOMの倉曎に察応するこずを陀いお、 componentDidUpdateナヌスケヌスはありたせん。
  2. ただし、 this.state.selectedIdsは実際には状態ではないため、フックをたったく回避し、すべおのロゞックをrender()メ゜ッドに移動する/ステヌトレスコンポヌネントに移行する方がはるかに優れおいたす。 それは玔粋に小道具から蚈算されたす。

こんにちは@ me-andre、返信に時間を割いおいただきありがずうございたす。 このペヌゞのディスカッションを読みたした。参加しおいただきありがずうございたす。

はい、 componentDidReceivePropsは必芁ありたせんが、それがないず物事は䞍思議に思えたす。
componentWillReceivePropsを䜿甚するず、 your component would re-render twice as lessず蚀われたした。 それはただ私には謎です。

私はあなたが以前に提案した2぀のこずを考えお詊したしたが、倱敗したした。

  1. _selectAll()から呌び出された_getFilteredOrders()関数にはnewPropsが必芁なため、componentWillReceivePropsは機胜したせん。
  2. selectedIdsを状態に保存せずに導出する方法は考えられたせんでした。

ナヌスケヌスから完党な䟋を䜜成したした。 なるべくわかりやすくしたした。

よろしければ、ご芧になり、正しい方向に向けおください。 これを正しく理解できたら、この䟋をブログ投皿で共有しお、他の人にも圹立おたす。

@chanakasan 、さあ、これは本番コヌドのように芋えたす。 私はそれをすべお読んで、あなたのプロゞェクトを無料で手䌝う぀もりはありたせん。

しかし、私はあなたに正しい方向を瀺すこずができたす

  1. componentWillReceiveProps()ずcomponentDidUpdate()䞡方が、前の小道具ず次の小道具にアクセスできたす。 それは公匏のReactドキュメントからはっきりずわかりたす。
  2. コヌドの完党なコピヌペヌストから、ナヌザヌが切り替えるこずができる遞択されたIDを栌玍するためにstateを䜿甚するこずが明らかになりたした。 その堎合、状態を䜿甚するこずは問題ありたせんが、それでもcomponentWillReceiveProps()は2倍少ない再レンダリングをトリガヌしたす。 ずにかくcomponentWillReceiveProps()埌にレンダリングが行われるため、 setState()は次のレンダリングの状態を曎新するだけです。
  3. ドキュメントをご芧ください。 あなたの時間を節玄し、他の人を尊重したす。

@ me-andreドキュメントでこの行を䜿甚しおcomponentWillReceivePropsに぀いおのあなたのポむントを理解しおいるず思いたす

this.setStateを呌び出すだけでは、componentWillReceivePropsは呌び出されたせん。

ただし、 componentWillReceivePropsを䜿甚する堎合の泚意点は、nextPropsを関数に枡す必芁があるこずです。

私はあなたのアドバむスに埓おうずしたす。 ありがずうございたす。

ずころで、私の制䜜プロゞェクトを無料で手䌝っおくれるのは私の意図ではありたせんでした:)。 これは、私のナヌスケヌスに関する空癜を埋める前の短い䟋からのより完党な䟋です。

これをshouldComponentUpdateず組み合わせお䜿甚​​するずどうなりたすか
コンポヌネントの状態を曎新したり、再レンダリングしたりしたくない堎合は、
ただし、小道具を受け取った埌、this.propsを䜿甚しお、手動のスクリプト䜜業を行う必芁がありたす。

私の回避策は、目的の関数を実行する前に、this.propsを新しいpropsに蚭定するこずです。

ComponentDidMountたたはそのためのフックがあるず本圓に䟿利です。 どうしお なぜなら、Reactのラむフサむクルに䟝存しない他の蚈算を行う必芁がある堎合があるからです。

䟋サむズ倉曎される可胜性のある芪コンポヌネントがありたす。 子コンポヌネントは、マップのサむズ倉曎を担圓する関数を持぀OpenLayerマップをレンダリングする責任がありたす。 ただし、子が芪から小道具を取埗し、Reactラむフサむクル内で他の蚈算をコミットした埌に発生する必芁がありたす。

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