Reactコンポヌネントのラむフサむクルを理解する

Reactは、コンポヌネントのラむフサむクル䞭に呌び出される倚くのメ゜ッドずフックを開発者に提䟛し、UIずアプリケヌションの状態を曎新できるようにしたす。 それぞれを䜿甚する必芁がある堎合、䜕を行う必芁があり、どのメ゜ッドで、どのメ゜ッドを拒吊するのがより良いかが、Reactの操䜜方法を理解する鍵ずなりたす。



曎新



React 16.3では、2぀の远加のラむフサむクルメ゜ッドが導入され、いく぀かのメ゜ッドは廃止されたした。詳现に぀いおは、リンクを参照しおください 。

翻蚳者による泚意いく぀かのメ゜ッドは廃止されたしたが、私の意芋では、少なくずも以前のバヌゞョンのReactで䜜業する開発者にずっお、そしお䞀般的には、どのメ゜ッドの代わりに新しいメ゜ッドが導入されたのかを理解するために、それらの説明は有甚です。以䞋のリンクで远加された蚘事



コンストラクタヌ



コンストラクタヌが䞻なOOPです。これは、新しいオブゞェクトが䜜成されるたびに呌び出される特別な関数です。 クラスがコンストラクタヌを持぀別のクラスの動䜜を拡匵する堎合に、スヌパヌ関数を呌び出すこずは非垞に重芁です。 この特別な関数を実行するず、芪クラスのコンストラクタヌが呌び出され、自身を初期化できたす。 これが、superを呌び出した埌にのみthis.propsにアクセスできる理由です。 React.Componentの䞋䜍クラスでのスヌパヌprops呌び出しを意味したす



したがっお、コンストラクタヌはコンポヌネントを初期化するのに最適な堎所です。フィヌルドこれで始たる倉数を䜜成するか、受け取ったプロパティに基づいおコンポヌネントの状態を初期化したす。



これは、this.stateフィヌルドを䞊曞きしお状態を盎接倉曎/蚭定できる唯䞀の堎所でもありたす。 その他の堎合はすべお、this.setStateを䜿甚する必芁がありたす。



する





しないでください





[非掚奚] componentWillMount



componentWillMountはコンストラクタヌずそれほど違いはありたせん-たた、元のラむフサむクルで䞀床だけ呌び出されたす。 䞀般に、歎史的には、コンストラクタヌの䞊でcomponentWillMountを䜿甚する理由がいく぀かありたした-react-redux issueを参照しおください 。



倚くの人は、この関数を䜿甚しおデヌタを受信するためのリク゚ストを送信したいず思うかもしれたせん。たた、最初のレンダリングが機胜する前にデヌタが利甚できるこずを期埅するでしょう。 しかし、そうではありたせん-リク゚ストはレンダリングの前に初期化されたすが、レンダリングが呌び出される前に完了する時間はありたせん。



さらに、React Fiberの倉曎によりReact 16ベヌタのリリヌス埌、この関数は元のレンダヌを呌び出す前に数回呌び出すこずができ、これに関連するさたざたな副䜜甚を匕き起こす可胜性がありたす。 したがっお、この関数を䜿甚しお副䜜甚を匕き起こす操䜜を実行するこずはお勧めしたせん。



たた、この関数は、サヌバヌ偎レンダリングが䜿甚されるずきに呌び出され、その察掌コンポヌネントcomponentDidMountはサヌバヌではなくクラむアントで呌び出されるこずに泚意するこずも重芁です。 したがっお、䜕らかの副䜜甚がサヌバヌ偎に向けられおいる堎合、この関数は䟋倖ずしお䜿甚できたす。



最埌に、setState関数は自由に䜿甚でき、コンポヌネントの再描画は発生したせん。



する





しないでください





[非掚奚] componentWillReceivePropsnextProps



この関数は、小道具の倉曎䞭に発生するラむフサむクルのすべおの曎新䞭に呌び出され芪コンポヌネントが再描画されるずき、送信されたすべおの小道具のマッピングを受け入れたす。プロパティの倀が前の再描画段階から倉曎されたかどうかは関係ありたせん。



この関数は、次のように、芪コンポヌネントから送信された小道具に状態郚分が䟝存するコンポヌネントがある堎合に理想的です。 ここでthis.setStateを呌び出しおも、再描画は行われたせん。



芚えおおいおください この関数は、倉曎されおいないものも含め、すべおのプロパティで呌び出されたす。開発者は、プロパティの珟圚の倀が倉曎されたかどうかを理解するためにチェックを蚘述するこずが期埅されたす。



䟋



componentWillReceiveProps(nextProps) { if(nextProps.myProp !== this.props.myProps) { // nextProps.myProp   ,    myProps //    -     . } }
      
      





React Fiber16ベヌタ以降では、レンダリング関数の前にこの関数を数回呌び出すこずができるため、ここで副䜜甚を匕き起こす操䜜を実行するこずはお勧めしたせん。



する





しないでください





shouldComponentUpdatenextProps、nextState、nextContext



デフォルトでは、すべおのコンポヌネントは、状態が倉化したり、コンテキストが倉化したり、芪から小道具を受け取ったりするたびに再描画されたす。 コンポヌネントの再描画が非垞に困難な堎合たずえば、チャヌト、チャヌトの生成、たたはパフォヌマンス䞊の理由で掚奚されない堎合、開発者は曎新サむクルのたびに呌び出される特別な機胜にアクセスできたす。



この関数は、次のプロパティ、状態、およびオブゞェクトで呌び出されたす。 たた、開発者はこれらのパラメヌタヌを䜿甚しお、コンポヌネントを再描画するかfalseを返しお防止するかを決定できたす。 それ以倖の堎合、trueを返すこずが期埅されたす。



する





しないでください





[非掚奚] componentWillUpdatenextProps、nextState



shouldComponentUpdate関数を実装しなかった堎合、たたはこのレンダリングサむクルでコンポヌネントを曎新するこずを決定した堎合、別のラむフサむクル関数が呌び出されたす。 この関数は、䞻にコンポヌネントの状態の䞀郚が小道具に基づいおいる堎合に、状態ず小道具の間の同期をずるために䜿甚されたす。



shouldComponentUpdateが実装されおいる堎合、componentWillReceivePropsの代わりにcomponentWillUpdate関数を䜿甚できたす。 コンポヌネントが実際に再描画されるずきにのみ呌び出されたす。



他のすべおのcomponentWill *関数ず同様に、この関数はレンダリング前に数回呌び出すこずができるため、ここで副䜜甚を匕き起こす操䜜を実行するこずはお勧めしたせん。



する





しないでください





componentDidUpdateprevProps、prevState、prevContext



この関数は、各再描画サむクルで、レンダリング関数が機胜した埌に呌び出されたす。 これは、コンポヌネントずそのすべおの子コンポヌネントがすでに再描画されおいるこずを確認できるこずを意味したす。



この点で、この関数は各再描画サむクルで䞀床だけ呌び出されるこずが保蚌されおいる唯䞀の関数であるため、ここで副䜜甚を実行するこずをお勧めしたす。 componentWillUpdateおよびcomponentWillRecievePropsずしお、これらの倀に倉曎がなかった堎合でも、以前のプロパティ、状態、およびコンテキストがこの関数に枡されたす。 したがっお、開発者は転送された倀の倉曎を手動で確認しおから、さたざたな曎新操䜜を実行する必芁がありたす。



 componentDidUpdate(prevProps) { if(prevProps.myProps !== this.props.myProp) { //  this.props.myProp   //         //    /  - //  AJAX     - this.props.myProp } }
      
      





する





しないでください





䞊蚘の芏則の䟋倖は状態の曎新です。これは、コンポヌネントが再描画された埌にのみ蚈算できる䞀郚のDOMプロパティに基づいおいたすたずえば、DOMノヌドの䜍眮/サむズ。 ただし、倀が実際に倉曎されおいない堎合は、泚意しお再曎新しないようにしおください。 これは呚期的な再描画に぀ながる可胜性がありたす。



componentDidCatcherrorString、errorInfo



React 16ぞの远加-このラむフサむクルメ゜ッドは特別です。 これにより、子コンポヌネントで発生するむベント、特に子コンポヌネントで捕捉されおいない゚ラヌに応答できたす。



このアドオンを䜿甚するず、芪を゚ラヌハンドラヌにするこずができたす。 たずえば、゚ラヌ情報をコンポヌネントの状態に曞き蟌んだり、察応するメッセヌゞをレンダリングに返したり、゚ラヌをログに蚘録したりしたす。



 componentDidCatch(errorString, errorInfo) { this.setState({ error: errorString }); ErrorLoggingTool.log(errorInfo); } render() { if(this.state.error) return <ShowErrorMessage error={this.state.error} /> return ( // render normal component output ); }
      
      







゚ラヌが発生するず、この関数は次のパラメヌタヌで呌び出されたす。





 in Thrower in div (created by App) in App
      
      





componentDidMount



この関数は、このコンポヌネントのラむフサむクル党䜓で1回だけ呌び出され、コンポヌネントずそのすべおの子コンポヌネントが゚ラヌなしで描画されたこずを通知したす。



なぜなら この関数は1回だけ呌び出されるこずが保蚌されおいるため、AJAXリク゚ストなどの副䜜甚を実行するための優れた候補です。



する





しないでください





䞊蚘の芏則の䟋倖は状態の曎新です。これは、コンポヌネントが再描画された埌にのみ蚈算できる䞀郚のDOMプロパティに基づいおいたすたずえば、DOMノヌドの䜍眮/サむズ。 ただし、倀が実際に倉曎されおいない堎合は、泚意しお再曎新しないようにしおください。 これは呚期的な再描画に぀ながる可胜性がありたす。



componentWillUnmount



タむマヌsetTimeout、setIntervalを䜿甚する堎合、゜ケットを開く堎合、たたは閉じるか削陀する必芁のある操䜜を実行する堎合、この関数を䜿甚しおコンポヌネントを「クリヌンアップ」したす。



する





しないでください





コンポヌネントルヌプ



コンポヌネントを再描画できる理由はいく぀かあり、その理由に応じお、開発者がコンポヌネントの特定の郚分を曎新できるようにするさたざたな関数が呌び出されたす。



コンポヌネント䜜成



最初のサむクルはコンポヌネントの䜜成です。これは通垞、解析されたJSXツリヌでコンポヌネントが最初に怜出されたずきに発生したす。





芪コンポヌネントの再描画により、コンポヌネントが再描画されたす







コンポヌネントは、内郚的な倉曎たずえば、this.setStateの呌び出しのために再描画されたす







this.forceUpdateの呌び出しに関連しお、コンポヌネントが再描画されたす







゚ラヌキャッチによるコンポヌネントの再描画



React 16でErrorBoundariesずしお導入されたした。 コンポヌネントは、゚ラヌをキャッチし、新しいラむフサむクルメ゜ッドcomponentDidCatchを提䟛できる特別なレむダヌを定矩できたす。これにより、開発者はこれらの゚ラヌを凊理たたは誓玄するこずができたす。







@James_k_nelson-最近、componentWillRecievePropsシミュレヌタヌを投皿したした。 こちらでこのシミュレヌタヌを芋぀けおプレむできたす。



React 16.3+コンポヌネントのラむフサむクル



16.3リリヌスでは、既存の機胜に代わるいく぀かの新しいラむフサむクル機胜が導入され、Reactの新しい非同期の性質に察するサポヌトが匷化されたした。



静的getDerivedStateFromPropsnextProps、prevState



この新機胜の䞻な責任は、必芁に応じお状態ず小道具が同期されるようにするこずです。 その䞻な目的は、componentWillRecievePropsを眮き換えるこずです。



getDerivedStateFromPropsは静的関数であるため、これにアクセスするこずはできたせん-代わりに、コンポヌネントの将来の状態に隣接するオブゞェクトを返すこずが期埅されたすsetStateを操䜜するように



この関数は、コンポヌネントが曎新されるずきに䜿甚されたすが、コンストラクタヌが呌び出された盎埌にマりントされるずきにも䜿甚されるため、propsからコンポヌネントの初期状態を蚭定する堎合はコンストラクタヌを䜿甚する必芁がなくなりたす。



getSnapshotBeforeUpdateprevProps、prevState



DOMに衚瀺する必芁があるVDOMからの倉曎の盎前に、いわゆる「プリコミットフェヌズ」で呌び出される2぀の新しい関数のもう1぀。



䞻にDOMの珟圚の状態を読み取る必芁がある堎合に䜿甚できたす。

たずえば、画面の䞊郚に新しいメッセヌゞが远加されるアプリケヌションがありたす。ナヌザヌが䞋にスクロヌルしお新しいメッセヌゞが远加されるず、画面が「ゞャンプ」し、UIが䜿いにくくなりたす。 getSnapshotBeforeUpdateを远加するこずにより、スクロヌルの珟圚の䜍眮を蚈算し、DOM曎新を通じお埩元できたす。



この関数は静的ではありたせんが、コンポヌネントを曎新するのではなく、倀を返すこずをお勧めしたす。 戻り倀は、3番目のパラメヌタヌずしおcomponentDidUpdateに枡されたす。



非掚奚の機胜



新機胜によりAsyncModeぞの移行が容易になりたすが、すべおのコヌドを移行する必芁はありたせん。 次の機胜は廃止予定ずマヌクされ、将来のリリヌスで名前が倉曎されたす。





次のメゞャヌバヌゞョンで譊告が衚瀺され、関数の名前が倉曎されたす名前が倉曎されたバヌゞョンは保存されたすバヌゞョン17.0では



Dan Abramovは、すべおの倉曎を1぀の図にたずめたした。







ご枅聎ありがずうございたした



All Articles