ホームページ >ウェブフロントエンド >jsチュートリアル >React のパフォーマンスをマスターする: 不必要な再レンダリングを防ぐための開発者ガイド

React のパフォーマンスをマスターする: 不必要な再レンダリングを防ぐための開発者ガイド

Barbara Streisand
Barbara Streisandオリジナル
2025-01-04 21:47:41142ブラウズ

Mastering React Performance: A Developer

React の仮想 DOM とコンポーネントベースのアーキテクチャにより、React は驚くほど効率的になりますが、適切な最適化がなければ、アプリケーションは依然としてパフォーマンスの問題に悩まされる可能性があります。不必要な再レンダリングを排除し、React アプリのパフォーマンスを向上させる実証済みの戦略について詳しく見ていきましょう。

再レンダリングを理解する: The Foundation

最適化する前に、React コンポーネントがいつ、そしてなぜ再レンダリングされるのかを理解する必要があります。

  • コンポーネントの状態が変化したとき
  • 小道具が変更されるとき
  • その親コン​​ポーネントが再レンダリングされるとき

すべての再レンダリングが悪いわけではありませんが、不要な再レンダリングはパフォーマンスに影響を与える可能性があります。それらを防ぐ方法を見てみましょう。

1. React.memo: 防御の第一線

const MovieCard = React.memo(({ title, rating, onLike }) => {
  console.log(`MovieCard rendered: ${title}`);
  return (
    <div className="card">
      <h3>{title}</h3>
      <span>Rating: {rating}/10</span>
      <button onClick={onLike}>Like</button>
    </div>
  );
});

// Usage
<MovieCard 
  title="Inception" 
  rating={9.3} 
  onLike={() => handleLike('inception')} 
/>

? プロのヒント: React.memo は強力ですが、戦略的に使用してください。すべてをメモすると、実際にパフォーマンスが低下する可能性があります。

2. useCallback: 関数参照の安定化

const MovieList = () => {
  const [movies, setMovies] = useState([]);

  const handleLike = useCallback((movieId) => {
    setMovies(prevMovies => 
      prevMovies.map(movie => 
        movie.id === movieId 
          ? { ...movie, likes: movie.likes + 1 }
          : movie
      )
    );
  }, []); // Empty deps array as it only uses setState

  return movies.map(movie => (
    <MovieCard
      key={movie.id}
      {...movie}
      onLike={() => handleLike(movie.id)}
    />
  ));
};

3. useMemo: 複雑な計算のキャッシュ

const MovieAnalytics = ({ movies }) => {
  const statistics = useMemo(() => ({
    averageRating: movies.reduce((acc, m) => acc + m.rating, 0) / movies.length,
    topRated: [...movies].sort((a, b) => b.rating - a.rating)[0],
    totalLikes: movies.reduce((acc, m) => acc + m.likes, 0)
  }), [movies]);

  return (
    <div>
      <h2>Analytics Dashboard</h2>
      <p>Average Rating: {statistics.averageRating.toFixed(1)}</p>
      <p>Most Popular: {statistics.topRated.title}</p>
      <p>Total Likes: {statistics.totalLikes}</p>
    </div>
  );
};

4. 状態管理のベストプラクティス

状態の引き上げ (必要な場合)

const MovieApp = () => {
  const [favorites, setFavorites] = useState(new Set());

  // Lifted state handler
  const toggleFavorite = useCallback((movieId) => {
    setFavorites(prev => {
      const next = new Set(prev);
      if (next.has(movieId)) next.delete(movieId);
      else next.add(movieId);
      return next;
    });
  }, []);

  return (
    <div>
      <MovieList onFavorite={toggleFavorite} />
      <FavoritesList ids={favorites} />
    </div>
  );
};

5. 高度な最適化手法

複雑なロジック用のカスタムフック

function useMovieData(movieId) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    let mounted = true;

    async function fetchMovie() {
      setLoading(true);
      try {
        const response = await fetch(`/api/movies/${movieId}`);
        const movie = await response.json();
        if (mounted) {
          setData(movie);
          setLoading(false);
        }
      } catch (error) {
        if (mounted) {
          console.error('Failed to fetch movie:', error);
          setLoading(false);
        }
      }
    }

    fetchMovie();
    return () => {
      mounted = false;
    };
  }, [movieId]);

  return { data, loading };
}

6. プロファイリングとデバッグ

React 開発者ツールの使用

  • React 開発者ツール プロファイラーを有効にする
  • コンポーネントのレンダリングを記録
  • 不必要な再レンダリングを特定する
  • レンダリング時間を測定する

パフォーマンスチェックリスト

✅ 純粋な機能コンポーネントには React.memo を使用します
✅ props
として渡されるイベントハンドラーの useCallback を実装します。 ✅ 高価な計算には useMemo を適用します
✅ レンダリングでのインライン オブジェクトの作成を避ける
✅ リストで適切なキー プロパティを使用します
✅ アプリを定期的にプロファイリングします

避けるべきよくある落とし穴

❌ 過剰な最適化
❌ 時期尚早な最適化
❌ すべてをメモする
❌ レンダリングで新しいオブジェクト/配列を作成する
❌ コンポーネントの深いネスト

今後の展望: React 19 とパフォーマンス

React 19 は自動的にパフォーマンスを向上させます:

  • 強化された自動バッチ処理
  • 同時レンダリングの改善
  • 状態更新のスケジュールの改善

結論

React のパフォーマンスの最適化は、コードの複雑さと実際のパフォーマンスの向上の間のバランスです。基本から始めて、アプリのパフォーマンスを測定し、必要に応じて最適化します。覚えておいてください: 時期尚早な最適化は諸悪の根源です!

✨ お役に立てば幸いです! React のヒントやコツをさらに知るには、「いいね」を押してフォローすることを忘れないでください!

? X (Twitter) と LinkedIn で私をフォローして、毎日の Web 開発のヒントと洞察を入手してください!

?コーディングを続け、作成を続け、改善を続けてください!

この素晴らしい日に、皆さんの成功と前向きな気持ちを祈っています。一緒に素晴らしいものを作りましょう! ?

反応 #javascript #webdev #パフォーマンス

以上がReact のパフォーマンスをマスターする: 不必要な再レンダリングを防ぐための開発者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。