0Pricing
React Academy · レッスン

ブロッキングしないUI更新のためのuseTransition

負荷の高いstate更新をstartTransitionでラップし、UIの応答性を保ちます。

「ブロッキングしないUI更新のためのuseTransition」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ようこそ

このレッスンでは、useTransitionフックを使って重い状態更新を緊急性の低い処理として扱い、バックグラウンドで重いレンダリングが行われている間もUIの応答性を維持します。

ブロッキング更新の問題

大きなリストを絞り込む検索ボックスに入力すると、Reactはキー入力のたびに絞り込み後のリスト全体を再レンダリングする必要があります。そのため入力の更新がすぐに反映されず、UIの動作が重く感じられます。

Reactの並行レンダリング

React 18では並行レンダリングが導入されました。Reactは状態更新のレンダリングを開始した後、一時停止して、入力などのより緊急性の高い更新を優先できます。useTransitionは、更新を低優先度のトランジションとして分類するためのフックです。

useTransitionの基本

useTransitionは`[isPending, startTransition]`を返します。緊急性の低い状態更新を`startTransition()`の中に記述してください。Reactは、制御された入力などの他の更新をトランジションより優先します。
const [isPending, startTransition] = useTransition();

const handleChange = (e) => {
  setInputValue(e.target.value); // urgent: update input immediately
  startTransition(() => {
    setFilteredList(filter(e.target.value)); // non-urgent
  });
};

ローディングUIに使うisPending

トランジションの処理中は、`isPending`が`true`になります。これを使ってローディングスピナーを表示したり、古い結果のリストを薄く表示したりすると、更新中であることをユーザーに伝えられます。
return (
  <>
    <input value={inputValue} onChange={handleChange} />
    {isPending && <Spinner />}
    <ResultList items={filteredList} />
  </>
);

startTransitionの中に入れるもの

startTransitionの中に入れるのは状態更新だけにしてください。非同期処理は入れません。重いレンダリングを引き起こす状態更新をラップします。
// Correct
startTransition(() => setTab('heavy'));

// Wrong — async work outside React state
startTransition(async () => { await fetch(...); }); // not supported

フックを使わないstartTransition

`isPending`が必要ない場合は、フックを使わずにReactからstartTransitionを直接インポートして呼び出せます。
import { startTransition } from 'react';

startTransition(() => setQuery(newValue));

タブ切り替えの例

よくある使用例は、タブのクリックで重いコンポーネントを切り替えることです。タブの変更をstartTransitionでラップすると、重いコンポーネントがバックグラウンドでレンダリングされている間も、アクティブなタブのインジケーターはすぐに更新されます。
const [tab, setTab] = useState('posts');
const [isPending, startTransition] = useTransition();

const selectTab = (t) =>
  startTransition(() => setTab(t));

useTransitionとuseDeferredValueの比較

useTransitionは、状態更新を自分で所有している場合(setStateを呼び出す場合)に使います。useDeferredValueは、直接遅延させられないプロップや値を受け取る場合に使い、その値自体を遅延させます。

最適化の代わりにはなりません

startTransitionはレンダリングを速くするものではなく、単に遅延させるだけです。コンポーネントのレンダリングに500ミリ秒かかる場合、依然として500ミリ秒かかります。本当に遅いリストには、React.memoや仮想化を組み合わせてください。

理解度チェック

useTransitionが返すisPendingは何を表しますか?

まとめ

useTransitionを使うと、状態更新を緊急性の低いトランジションとして分類できます。入力などの緊急性の高い更新はすぐにレンダリングされ、トランジションはReactに余裕があるときにレンダリングされます。isPendingを使ってローディング中であることを示してください。

次のレッスン

次のレッスンは、**入力のデバウンスに使うuseDeferredValue**です。入力の軽快な応答性を保ちながら、UIの遅い部分の再レンダリングを遅延させる方法を学びます。

よくある質問

「ブロッキングしないUI更新のためのuseTransition」レッスンは無料ですか?

はい。「ブロッキングしないUI更新のためのuseTransition」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「ブロッキングしないUI更新のためのuseTransition」で何を学びますか?

負荷の高いstate更新をstartTransitionでラップし、UIの応答性を保ちます。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ブロッキングしないUI更新のためのuseTransition」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 競合状態とEffectのクリーンアップ
  2. ブロッキングしないUI更新のためのuseTransition
  3. 入力のデバウンスに使うuseDeferredValue
  4. データとコードの境界に使うSuspense
← React Academyに戻る