Closed10

React performance関連の記法を試してみる

Kyosuke KuboKyosuke Kubo

目標

Reactのperforance関連の記法の使いどきを理解した状態になる。

具体的には下記↓

  • React.memo
  • useCallback
  • useMemo
Kyosuke KuboKyosuke Kubo

React.memo

React.memoはレンダリングをする際にレンダリング前のコンポーネントを比較して差がない場合レンダリングをスキップさせる記法。

コンポーネント単位でレンダリングを制御することができる。

キャッシュみたいな感じ。

Kyosuke KuboKyosuke Kubo

const alertChildNum = (): void => {
    alert(childNum);
  };
<ChildOne num={childNum} alertChildNum={() => alertChildNum()} />

こんな感じで親のコンポーネントで定義した関数を子にPropsとして渡している場合はレンダリングをスキップできない。

なぜかというと、親がレンダリングされた段階で親で定義された関数は新しくなりReact.memoが同じものとして認識しないため。

ディープイコールで参照をチェックしているだろう。

Kyosuke KuboKyosuke Kubo

useCallback

Kyosuke KuboKyosuke Kubo

React.memo はコンポーネントを対象にしていたが、useCallback は関数に対して再生成するかどうかを対象にする。

React.memo でメモ化したコンポーネントにコールバック関数を渡す際に、対象関数をuseCallbackしてあげると効果を発揮する。

const alertChildNum = useCallback(() => {
    alert("click");
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);
Kyosuke KuboKyosuke Kubo

useMemo

Kyosuke KuboKyosuke Kubo

useMemoは、値の計算結果を検証して再計算するか判断してくれる。

const doubledNum: number = useMemo(() => double(doubleCount), [doubleCount]);

上記のコードの場合、doubleCountが変化したらdoubleを実行する。
他のstateのみが変化した際は再計算は実行されない。

このスクラップは2021/11/17にクローズされました