Open8

react 再レンダリングの抑制について

oosukeoosuke

context apiを利用した場合、contextのオブジェクトを参照しているコンポーネントは再レンダリングを促される。

これを抑制するための案

  1. そもそもcontextを細分化して関心のあるオブジェクトを絞る
  2. contextの値を参照する前にコンポーネントを挟ま込みmemo化する。reduxのconnectが行なっていることに近い。
oosukeoosuke

fluxは利用したい。それを実現する手段としてuseReducerを使いたい

oosukeoosuke

useContextを、wrapしたカスタムフックを提供する
そのカスタムフックはProviderとhocを提供する。hocには値を参照するためのもの、値を更新するためのinterfaceが渡される

oosukeoosuke
  1. contextに渡す値をrefにする。このrefの値が変化した際にレンダリングするか否かはコンポーネントの判断に任せる。
oosukeoosuke

ぱっと見コードが見づらい。コンポーネントでレンダリングを強制するためのsetStateが必要になる

oosukeoosuke

レンダリングコストを許容してcontextの影響範囲をアプリになんの支障もない粒度にとどめる。

  1. 値を購読するオブザーバーを用意して強制レンダリングをするためのsetstateをsubscribeする