ほぼuseCallback
と同じ役割です。主に参照を返すような値をいくつも作らないようにする為に使います。
useMemo
には1つ目の引数に好きな値、2つ目にはuseCallback
などと同じ用に条件を渡します。この条件がセットで同じ値の時は前回返した値を返します。
以下は例です。
const obj = useMemo(
{foo, bar, baz},
[foo, bar, baz]
);
例えば、
foo === 1
bar === 2
baz === 3
な時obj
は{foo: 1, bar: 2, baz: 3}
というオブジェクトを返します。次に同じ条件のセットで再度実行されるとobj
前回返した{foo: 1, bar: 2, baz: 3}
をそのまま返します。もし違う条件のセットであれば新しいオブジェクトを作って返します。
依存無しの値
もし値が外部のどんな変数にも依存してない場合、明らかに生成が必要な値は1つになります。明らかに1つの時は条件に空配列を置きます。
useMemo(
{ /* ... */ },
[]
);
これで常に{ /* ... */ } === { /* ... */ }
な値が返ります。
依存無しなのにわざわざuseMemo
を使う必要があるのかとも思うかもしれません。これは必要あります。でなければ、子コンポーネントに渡すときに違う参照の値を渡すことになり、子コンポーネントから見れば毎回違うセットのprops
が渡ってくるように見える為です。