【入門編】 useMemoフックによる計算結果のメモ化 – React実践ガイド

やあ、こんにちは。Reactの世界へようこそ。
フロントエンドの深淵を覗き込んでいると、ときどき「あれ? なんだか画面の動きがもっさりしてきたぞ?」と感じる瞬間が訪れるはずです。

そう、Reactは魔法のように画面を更新してくれますが、その裏では「コンポーネントが再レンダリングされるたびに、中のコードを全部最初からやり直す」という、実はかなり律儀で働き者な性質があるんです。

今日は、そんなReactの「働きすぎて疲れてしまう癖」を治すための秘策、『useMemo』について、お茶でも飲みながら紐解いていきましょう。

—

1. その計算、毎回やる必要ある?

まずは、想像してみてください。あなたは今、「超絶複雑な計算」をしなければならないとします。たとえば、「100万個の数字の中から特定の条件に合うものを探し出し、統計を取る」といったような、CPUが汗をかくような作業です。

もし、この作業を「画面上のボタンを押すたび」や「文字を1文字入力するたび」に繰り返していたらどうなるでしょう?
当然、パソコンは悲鳴を上げて、画面の反応はどんどん遅くなりますよね。

Reactも同じです。コンポーネントが再レンダリングされるたびに、関数の中身を上から下まで全部実行し直します。でも、「前回の計算結果と、今回の入力データが同じなら、計算なんてしなくていいじゃないか!」と思いませんか?

その願いを叶えてくれるのが、`useMemo`というフックです。

2. useMemoは「魔法のメモ帳」

`useMemo`を一言で言えば、「計算結果を記録しておく魔法のメモ帳」です。

1. 計算結果をメモ帳(メモリ)に書き留める。
2. 次回、同じ計算を求められたら、計算せずにメモ帳から答えを読み出す。
3. もし「材料(依存データ)」が変わったら、メモを捨てて新しく計算し直す。

この仕組みを使うことで、無駄な再計算をバッサリとカットできるんです。

コードで見てみましょう

まずは、`useMemo`を使わない「頑張り屋さんすぎる」コードを見てみます。

import React, { useState } from ‘react’;

function ExpensiveComponent({ count }) {
// 非常に重い計算を想定(わざと時間をかけています)
const heavyCalculation = (num) => {
console.log(“重い計算を実行中…”);
for (let i = 0; i < 1000000000; i++) {} // 無駄にループさせる return num 2; }; // これだと、他のStateが変わるたびに毎回「重い計算」が走ってしまう! const result = heavyCalculation(count); return

結果: {result}

;
}

このままだと、親コンポーネントで別の状態(例えば入力フォームなど)が更新されただけでも、この`heavyCalculation`が動いてしまい、画面がカクつきます。

これを、`useMemo`でスマートに解決してみましょう。

import React, { useState, useMemo } from ‘react’;

function SmartComponent({ count }) {
// useMemoで計算結果を包む
// 第2引数の [count] が「これに変更があった時だけ再計算してね」という合図です
const result = useMemo(() => {
console.log(“重い計算を実行中…”);
let sum = 0;
for (let i = 0; i < 1000000000; i++) { sum += i; } return count 2; }, [count]); // ← ここがポイント! return

結果: {result}

;
}

どうでしょう? `[count]` という配列を渡すことで、「countが変わった時以外は、前のメモを見ろ!」とReactに指示を出しているイメージです。これで、無駄な計算は一切行われません。

—

3. 注意点:なんでもかんでもメモすればいいわけじゃない

ここで一つ、ベテランからの大切なアドバイスを。
「じゃあ、全部の計算にuseMemoを使えば最強じゃない?」 と思うかもしれませんが、それは違います。

実は、`useMemo`を使うこと自体にも、Reactは「メモ帳を管理するコスト」を支払っています。

  • 単純な計算(例: `a + b`): これを`useMemo`で囲むのは、買い物に行くのにわざわざGPSとルート検索アプリを起動するようなもの。そのまま計算した方が圧倒的に早いです。
  • 重い計算: 使う価値は大いにあります。

「その計算は、本当に重いのか?」を一度立ち止まって考えてみてください。Reactは賢いので、大抵の計算はメモなしでも爆速でこなしてくれます。「パフォーマンスが落ちてきたな」と感じた時の、とっておきの切り札として使うのが、一番カッコいい使い方ですよ。

—

最後に:つまずくのは当たり前です

`useMemo`の依存配列(第2引数)を書き忘れたり、逆に中身を頻繁に変えてしまってメモの効果が出なかったり。そんな失敗は、世界中のどんなプログラマーも一度は通る道です。

「あ、この計算、毎回やり直してるかも?」と気づけたこと自体が、あなたのフロントエンドエンジニアとしての大きな一歩です。

まずは小さなコンポーネントで、`console.log`を仕込んで「あ、計算が走っていない!」という感覚を体感してみてください。その小さな成功体験の積み重ねが、いつかあなたを素晴らしいアーキテクトへと育ててくれるはずです。

応援していますよ。困ったことがあれば、いつでもまた聞きに来てくださいね。

コメント

タイトルとURLをコピーしました