こんにちは。フロントエンドの現場で日々コードと格闘しているチーフアーキテクトです。
Reactを触り始めると、「画面が急にカクつくな……」とか「文字入力の反応がなんだか重いぞ?」という壁にぶつかることが必ずあります。これ、実はあなたのコードが悪いわけではなく、Reactが「全部一気に処理しようとしてパンクしている」だけなんです。
今日は、そんな悩みを魔法のように解決する`useTransition`という、現場でめちゃくちゃ重宝されている「優先順位付けの術」についてお話しします。
—
「お買い物リスト」で考える、Reactの忙しさ
想像してみてください。あなたはスーパーのレジ打ち担当です。
1. 緊急の仕事(入力): お客さんが次々と商品をカゴに置いていきます。これは素早くスキャンしてあげないと、お客さんはイライラしますよね。
2. 重い仕事(検索・表示): レジの横で、1万件の商品データベースから「今日のおすすめ」を検索して、さらにそれをリストとして画面に描画する……という作業。
もし、この「重い検索」のせいで、目の前の「商品スキャン」が止まってしまったらどうでしょう? お客さんは怒って帰ってしまいますよね。
Reactもこれと同じです。「入力(緊急)」と「複雑な計算・描画(非緊急)」を同時にやろうとすると、画面がカクついて操作感が最悪になるんです。
ここで登場するのが`useTransition`です。これを使うと、Reactにこう伝えられるようになります。
「検索処理は大事だけど、まずは入力処理を優先してね。検索結果の更新はちょっと遅れてもいいから、後回しでよろしく!」
—
実際にコードを見てみよう
`useTransition`を使うと、Reactから「今、処理を待機中だよ」というフラグ(`isPending`)と、「この処理を後回しにするよ」という合図(`startTransition`)がもらえます。
import React, { useState, useTransition } from ‘react’;
function SearchApp() {
const [input, setInput] = useState(“”); // 入力された文字
const [list, setList] = useState([]); // 表示するリスト
// 1. useTransitionを準備します
// isPending: 今、後回しにしている処理が進行中かどうか
// startTransition: 「この中身は優先度を下げていいよ」と指示する関数
const [isPending, startTransition] = useTransition();
const handleChange = (e) => {
const value = e.target.value;
setInput(value); // 入力値の更新は「緊急」なのでそのまま実行
// 2. リストを更新する重い処理を、startTransitionで囲みます
startTransition(() => {
const newList = Array.from({ length: 10000 }, (_, i) => `${value} – 項目 ${i}`);
setList(newList);
});
};
return (
{/ 3. 処理中は「読み込み中…」と表示してユーザーに優しく /}
{isPending &&
検索結果を準備中…
}
-
{list.map((item, index) =>
- {item}
)}
);
}
—
なぜこの書き方が「現場の知恵」なのか
このコードのポイントは、「ユーザーを待たせないこと」にあります。
- 入力のサクサク感: `setInput`は`startTransition`の外にあります。だから、キーボードを叩いた瞬間に文字が入力されます。
- 重い処理の切り離し: `setList`は`startTransition`の中にあります。Reactは「おっ、これは重い作業だな。先にキーボードの入力を受け付けて、空いた時間にリストを更新しよう」と判断してくれます。
- フィードバックの重要性: `isPending`を使って「読み込み中」を表示しています。ユーザーは「フリーズしたのかな?」と不安にならず、「あ、今計算してるんだな」と待つことができます。この「ちょっとした気遣い」が、プロダクトの質を大きく左右するんです。
—
最後に:つまずいても大丈夫
最初は「`startTransition`って何? 何を囲めばいいの?」と混乱するかもしれません。でも、それでいいんです。現場のエンジニアも、最初は「とりあえず全部入れたら重くなった」と泣きを見ながら、少しずつ「どこが重いのか?」を切り分けていくんですから。
もし画面が重いと感じたら、まずは「どれが今すぐ反応しなきゃいけない操作で、どれが後回しでもいい結果表示なのか」を紙に書き出してみてください。それができれば、`useTransition`をどこに書くべきか、自然と見えてきます。
Reactは、あなたの書いたコードを一生懸命に実行しようとしてくれます。でも、時には「こっちは後回しでいいよ」と優しく声をかけてあげてください。そうすれば、あなたのアプリは驚くほど軽やかに動くはずです。
一緒に、心地よいUIを作っていきましょう!応援しています。

コメント