メモ化
(関数の純粋性(羃等性?)を仮定して)関数の引数と返値の組を覚えておいて,同じ引数のとき関数の計算を省くこと. 実装として引数をKey,返値をValueとするMapに突っ込むというものがある.この場合,状態空間が広いとメモリを食ったり,Mapの探索に時間がかかってメモ化の意味がなくなることがあるので,いろいろと工夫して最適化してやる Reactの文脈で「メモ化」という言葉が使われる場合,たいてい「前に使われた引数と比較して,同じだったら前の返値を使う」というもの.(RecoilのatomFamily/selectorFamilyの内部のメモ化のような例外はある) 上述の実装のMapのサイズを1に固定したと考えてもよさそう
こういう挙動はRxのdistinctUntilChangedオペレータやシェルのuniqコマンドのような,イベントストリームを扱う体系によくみられるはず これはReactのコンポーネントのpropsが実質的にイベントストリームであるからでは?と思う
コンポーネントは時系列によって新しいpropsが作られて流れてくるのをReactElementに変換している
hooksによって複雑にはなってきているが,結局はそれ
イベント(stateの変化)で駆動するpropsのストリームに対してdistinctUntilChangedで無駄な再レンダーを抑制するのがReact.memo プリミティブでないオブジェクトはReactのアーキテクチャでは基本的に変化することなく作り直されるオブジェクトであり、一度変化したら等価にならないので変化したpropsが元のpropsに戻ることは非常にまれ
オブジェクトを可能な限り等価にしてReact.memoが使えるようにするのがuseMemoだったりuseCallbackだったりはたまたreselectだったりする さっさとレコードだったりタプルだったりが使えるようになって幸せになりたいね