ホームページ > ウェブフロントエンド > jsチュートリアル > React の自動最適化: メモ、useMemo、および useCallback とは別れますか?

React の自動最適化: メモ、useMemo、および useCallback とは別れますか?

Mary-Kate Olsen
リリース: 2025-01-07 20:31:41
オリジナル
550 人が閲覧しました

React Automatic Optimization: Goodbye memo, useMemo, and useCallback?

React 19 では、パフォーマンスの最適化、特にメモ化の処理方法が大幅に改善されました。 memo、useMemo、useCallback がどのように進化し、現在デフォルトでどのように最適化されているかを見てみましょう。

React におけるメモ化の進化

以前の React 18 では、開発者は不必要な再レンダリングを防ぎ、パフォーマンスを最適化するために、いつメモ化手法を使用するかを慎重に検討する必要がありました。 React 19 は、これらのツールをより効率的にし、多くの場合不要にする自動最適化を導入することで、このパラダイムを変えています。

React 19 のメモ: よりスマートなコンポーネントのメモ化

React 19 のメモでは、コンポーネントをいつ再レンダリングするかについて大幅にインテリジェントになりました。フレームワークは、プロップの変更とコンポーネントの出力への影響を自動的に追跡します。

例 1: 基本的なプロパティの比較

// React 18
const UserCard = memo(({ user, onUpdate }) => {
  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={onUpdate}>Update</button>
    </div>
  );
});

// React 19
// memo is now automatically optimized
const UserCard = ({ user, onUpdate }) => {
  return (
    <div>
      <h2>{user.name}</h2>
      <button onClick={onUpdate}>Update</button>
    </div>
  );
});
ログイン後にコピー

例 2: ネストされたコンポーネント

// React 18
const CommentThread = memo(({ comments, onReply }) => {
  return (
    <div>
      {comments.map(comment => (
        <Comment 
          key={comment.id}
          {...comment}
          onReply={onReply}
        />
      ))}
    </div>
  );
});

// React 19
const CommentThread = ({ comments, onReply }) => {
  return (
    <div>
      {comments.map(comment => (
        <Comment 
          key={comment.id}
          {...comment}
          onReply={onReply}
        />
      ))}
    </div>
  );
});
ログイン後にコピー

useMemo: 値の自動メモ化

React 19 の useMemo は、メモ化が有益なタイミングを自動的に検出するように最適化され、手動による最適化の必要性が減りました。

例 1: 高価な計算

// React 18
const ExpensiveChart = ({ data }) => {
  const processedData = useMemo(() => {
    return data.map(item => ({
      ...item,
      value: complexCalculation(item.value)
    }));
  }, [data]);

  return <ChartComponent data={processedData} />;
};

// React 19
const ExpensiveChart = ({ data }) => {
  // React 19 automatically detects expensive operations
  const processedData = data.map(item => ({
    ...item,
    value: complexCalculation(item.value)
  }));

  return <ChartComponent data={processedData} />;
};
ログイン後にコピー

例 2: オブジェクト参照

// React 18
const UserProfile = ({ user }) => {
  const userStyles = useMemo(() => ({
    background: user.premium ? 'gold' : 'silver',
    border: `2px solid ${user.active ? 'green' : 'gray'}`
  }), [user.premium, user.active]);

  return <div>



<h3>
  
  
  Example 3: Derived State
</h3>



<pre class="brush:php;toolbar:false">// React 18
const FilteredList = ({ items, filter }) => {
  const filteredItems = useMemo(() => 
    items.filter(item => item.category === filter),
    [items, filter]
  );

  return <List items={filteredItems} />;
};

// React 19
const FilteredList = ({ items, filter }) => {
  // React 19 automatically optimizes derived state
  const filteredItems = items.filter(item => item.category === filter);
  return <List items={filteredItems} />;
};
ログイン後にコピー

useCallback: よりスマートな関数のメモ化

React 19 の useCallback は、関数の安定性と参照の等価性に関してよりインテリジェントになりました。

例 1: イベント ハンドラー

// React 18
const TodoList = ({ todos, onToggle }) => {
  const handleToggle = useCallback((id) => {
    onToggle(id);
  }, [onToggle]);

  return todos.map(todo => (
    <TodoItem 
      key={todo.id}
      {...todo}
      onToggle={handleToggle}
    />
  ));
};

// React 19
const TodoList = ({ todos, onToggle }) => {
  // React 19 automatically maintains function stability
  const handleToggle = (id) => {
    onToggle(id);
  };

  return todos.map(todo => (
    <TodoItem 
      key={todo.id}
      {...todo}
      onToggle={handleToggle}
    />
  ));
};
ログイン後にコピー

例 2: 依存関係のあるコールバック

// React 18
const SearchComponent = ({ onSearch, searchParams }) => {
  const debouncedSearch = useCallback(
    debounce((term) => {
      onSearch({ ...searchParams, term });
    }, 300),
    [searchParams, onSearch]
  );

  return <input onChange={e => debouncedSearch(e.target.value)} />;
};

// React 19
const SearchComponent = ({ onSearch, searchParams }) => {
  // React 19 handles function stability automatically
  const debouncedSearch = debounce((term) => {
    onSearch({ ...searchParams, term });
  }, 300);

  return <input onChange={e => debouncedSearch(e.target.value)} />;
};
ログイン後にコピー

例 3: 複雑なイベント処理

// React 18
const DataGrid = ({ data, onSort, onFilter }) => {
  const handleHeaderClick = useCallback((column) => {
    onSort(column);
    onFilter(column);
  }, [onSort, onFilter]);

  return (
    <table>
      <thead>
        {columns.map(column => (
          <th key={column} onClick={() => handleHeaderClick(column)}>
            {column}
          </th>
        ))}
      </thead>
      {/* ... */}
    </table>
  );
};

// React 19
const DataGrid = ({ data, onSort, onFilter }) => {
  // React 19 optimizes function creation and stability
  const handleHeaderClick = (column) => {
    onSort(column);
    onFilter(column);
  };

  return (
    <table>
      <thead>
        {columns.map(column => (
          <th key={column} onClick={() => handleHeaderClick(column)}>
            {column}
          </th>
        ))}
      </thead>
      {/* ... */}
    </table>
  );
};
ログイン後にコピー

React 19 の最適化の主な利点

  1. ボイラープレートの削減: 明示的なメモ化ラッパー コードの必要性が少なくなります
  2. 自動パフォーマンス: React はコンポーネントの更新をインテリジェントに処理します
  3. 開発者エクスペリエンスの向上: 最適化に関する意思決定の削減
  4. バンドル サイズの改善: メモ化コードが減ればバンドルも小さくなります
  5. 自動安定性: 参照の等価性の処理の改善
  6. スマート再レンダリング: より効率的な更新スケジュール

引き続き明示的メモ化を使用する場合

React 19 の自動最適化は強力ですが、明示的なメモ化が有益な場合もあります。

  1. 非常に高価な計算を確実にメモ化したい場合
  2. 参照の安定性を保証したい複雑なデータ構造を扱う場合
  3. きめ細かい制御が必要なパフォーマンスが重要なアプリケーション
  4. 安定した参照を期待する外部ライブラリと統合する場合

結論

React 19 のメモ化の改善により、最適化を手動で管理することなく、パフォーマンスの高いアプリケーションを簡単に作成できるようになりました。このフレームワークは、多くの一般的な最適化シナリオを自動的に処理するようになり、すぐに使用できるコードがクリーンになり、パフォーマンスが向上します。

これらの最適化は強力ですが、その仕組みを理解すると、特定のユースケースで自動最適化に依存する時期と手動最適化を実装する時期について、より適切な決定を下すのに役立ちます。

コーディングを楽しんでください!

以上がReact の自動最適化: メモ、useMemo、および useCallback とは別れますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート