ホームページ > ウェブフロントエンド > jsチュートリアル > React デザイン パターン: スケーラブルなアプリケーションのベスト プラクティス

React デザイン パターン: スケーラブルなアプリケーションのベスト プラクティス

Patricia Arquette
リリース: 2024-12-30 09:22:24
オリジナル
165 人が閲覧しました

React デザインパターンの概要

React アプリケーションのサイズと複雑さが増大するにつれて、クリーンで効率的かつスケーラブルなコードを維持することが課題になります。 React 設計パターンは、一般的な開発問題に対する実証済みのソリューションを提供し、開発者が管理と拡張が容易なアプリケーションを構築できるようにします。これらのパターンはモジュール性、コードの再利用、ベスト プラクティスの順守を促進し、React 開発者にとって不可欠なツールとなります。

このガイドでは、コンテナとプレゼンテーション コンポーネントカスタム フックメモ化パターンなどの主要な React 設計パターンを実践的な方法で検討します。その利点を示す例を示します。初心者でも経験豊富な開発者でも、この記事はこれらのパターンを使用してワークフローを改善し、より良い React アプリケーションを作成する方法を理解するのに役立ちます。

コンテナとプレゼンテーションのコンポーネント

コンテナおよびプレゼンテーション コンポーネント パターンは、アプリケーション ロジックを UI レンダリングから分離する、React で広く使用されている設計アプローチです。この分離は、懸念事項の分離の原則に沿って、モジュール式で再利用可能でテスト可能なコンポーネントを作成するのに役立ちます。

  • コンテナコンポーネント: ビジネスロジック、状態管理、データフェッチを処理します。彼らは物事がどのように機能するかに焦点を当てています。
  • プレゼンテーション コンポーネント: データと UI の表示を処理します。彼らは物事がどのように見えるかに焦点を当てます。

この分割により、ロジックや UI の変更を相互に影響を与えることなく独立して処理できるため、コードベースの保守が容易になります。

パターンの利点

  1. コードの再利用性: プレゼンテーション コンポーネントは、アプリケーションのさまざまな部分で再利用できます。
  2. テスト容易性の向上: ロジックがコンテナ コンポーネントに分離されるため、テストが容易になります。
  3. メンテナンスの簡素化: ロジックまたは UI の変更に個別に対処できるため、コードの他の部分が破損するリスクが軽減されます。

例: ユーザーデータの取得と表示

コンテナとプレゼンテーション コンポーネントのパターンを実装する方法は次のとおりです:

コンテナコンポーネント

import React, { useState, useEffect } from "react";
import UserList from "./UserList";

const UserContainer = () => {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch("/api/users")
      .then((response) => response.json())
      .then((data) => {
        setUsers(data);
        setLoading(false);
      })
      .catch(() => setLoading(false));
  }, []);

  return <UserList users={users} loading={loading} />;
};

export default UserContainer;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

プレゼンテーションコンポーネント

import React from "react";

const UserList = ({ users, loading }) => {
  if (loading) return <p>Loading...</p>;

  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
};

export default UserList;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この例では:

  • UserContainer はユーザー データを取得し、それを読み込み状態とともに props として UserList に渡します。
  • UserList は、ユーザー データのレンダリングのみに重点を置いています。

このパターンは明確さを高め、コードの重複を減らし、テストを簡素化します。これは、データの取得と UI レンダリングが頻繁かつ複雑なアプリケーションに特に役立ちます。

コンポジション用のカスタムフック

カスタム フック を使用すると、再利用可能なロジックをカプセル化して、React コードをよりクリーンかつモジュール化できます。複数のコンポーネント間でロジックを複製する代わりに、ロジックをフックに抽出して、必要な場所で使用できます。これにより、DRY (繰り返さない) 原則を遵守しながら、コードの再利用性とテスト容易性が向上します。

例: データフェッチフック

カスタムフック

import React, { useState, useEffect } from "react";
import UserList from "./UserList";

const UserContainer = () => {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch("/api/users")
      .then((response) => response.json())
      .then((data) => {
        setUsers(data);
        setLoading(false);
      })
      .catch(() => setLoading(false));
  }, []);

  return <UserList users={users} loading={loading} />;
};

export default UserContainer;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

フックの使用

import React from "react";

const UserList = ({ users, loading }) => {
  if (loading) return <p>Loading...</p>;

  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
};

export default UserList;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

この例では、useFetchData フックによってデータ フェッチ ロジックがカプセル化され、任意のコンポーネントが最小限の定型文でデータをフェッチできるようになります。カスタム フックは、コードを簡素化し、クリーンなアーキテクチャを確保するために非常に役立ちます。

レデューサによる状態管理

複雑な状態やグループ化された状態を管理する場合、Reducer Pattern は状態遷移を処理するための構造化された方法を提供します。状態ロジックを 1 つの関数に集中化することで、状態の更新が予測可能になり、デバッグが容易になります。 React の useReducer フックは、このパターンの実装に最適です。

レデューサの利点

  1. 予測可能性: 状態の変更はアクションを通じて明示的に定義されます。
  2. スケーラビリティ: 複数の依存関係を持つ複雑な状態管理に適しています。
  3. 保守性: 一元化されたロジックにより、デバッグとテストが簡素化されます。

例: 認証状態の管理

レデ​​ューサ機能

import { useState, useEffect } from "react";

const useFetchData = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch(url)
      .then((res) => res.json())
      .then((result) => {
        setData(result);
        setLoading(false);
      });
  }, [url]);

  return { data, loading };
};

export default useFetchData;
ログイン後にコピー
ログイン後にコピー

useReducer を使用するコンポーネント

import React from "react";
import useFetchData from "./useFetchData";

const Posts = () => {
  const { data: posts, loading } = useFetchData("/api/posts");

  if (loading) return <p>Loading...</p>;
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};

export default Posts;
ログイン後にコピー
ログイン後にコピー

この例では:

  • authReducer は、アクションに基づいて状態がどのように変化するかを定義します。
  • AuthComponent は useReducer を使用して認証状態を管理します。

リデューサーは、スケーラブルなアプリケーションで複雑な状態ロジックを処理する場合に特に効果的であり、状態管理の明確さと一貫性を促進します。

コンテキスト API のプロバイダー パターン

プロバイダー パターン は、React の Context API を利用して、プロパティのドリルを行わずにコンポーネント間で状態や関数を共有します。コンポーネントをコンテキスト プロバイダーでラップし、深くネストされたコンポーネントが共有データにアクセスできるようにします。

利点

  1. プロップドリルの回避: 深くネストされたコンポーネントを介したデータの受け渡しを簡素化します。
  2. 集中状態管理: テーマや認証などのグローバル状態を簡単に管理します。

例: テーマのコンテキスト

const initialState = { isAuthenticated: false, user: null };

function authReducer(state, action) {
  switch (action.type) {
    case "LOGIN":
      return { ...state, isAuthenticated: true, user: action.payload };
    case "LOGOUT":
      return initialState;
    default:
      return state;
  }
}
ログイン後にコピー
ログイン後にコピー

コンテキストの使用

import React, { useState, useEffect } from "react";
import UserList from "./UserList";

const UserContainer = () => {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch("/api/users")
      .then((response) => response.json())
      .then((data) => {
        setUsers(data);
        setLoading(false);
      })
      .catch(() => setLoading(false));
  }, []);

  return <UserList users={users} loading={loading} />;
};

export default UserContainer;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

高次コンポーネント (HOC)

高次コンポーネント (HOC) は、コンポーネントを受け取り、機能が追加された新しいコンポーネントを返す関数です。これらを使用すると、構造を変更せずに、複数のコンポーネント間でロジックを再利用できます。

利点

  1. コードの再利用性: コンポーネント間で認証やテーマなどのロジックを共有します。
  2. カプセル化: 強化されたロジックを元のコンポーネントから分離します。

例: 認証 HOC

import React from "react";

const UserList = ({ users, loading }) => {
  if (loading) return <p>Loading...</p>;

  return (
    <ul>
      {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
};

export default UserList;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

複合成分

複合コンポーネント パターンを使用すると、連携して動作する複数の子コンポーネントを含む親コンポーネントを構築できます。このパターンは、柔軟で再利用可能な UI コンポーネントを作成するのに最適です。

利点

  1. カスタマイズ性: 子コンポーネントはさまざまな方法で組み合わせることができます。
  2. 明確さ: 親コンポーネントと子コンポーネント間の関係を明確に定義します。

React Design Patterns: Best Practices for Scalable Applications

例: タブコンポーネント

import { useState, useEffect } from "react";

const useFetchData = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch(url)
      .then((res) => res.json())
      .then((result) => {
        setData(result);
        setLoading(false);
      });
  }, [url]);

  return { data, loading };
};

export default useFetchData;
ログイン後にコピー
ログイン後にコピー
  1. useMemo: 計算の結果をメモ化し、依存関係が変更された場合にのみ再計算します。
import React from "react";
import useFetchData from "./useFetchData";

const Posts = () => {
  const { data: posts, loading } = useFetchData("/api/posts");

  if (loading) return <p>Loading...</p>;
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};

export default Posts;
ログイン後にコピー
ログイン後にコピー
  1. useCallback: 関数をメモ化します。子コンポーネントにコールバックを渡すときに役立ちます。
const initialState = { isAuthenticated: false, user: null };

function authReducer(state, action) {
  switch (action.type) {
    case "LOGIN":
      return { ...state, isAuthenticated: true, user: action.payload };
    case "LOGOUT":
      return initialState;
    default:
      return state;
  }
}
ログイン後にコピー
ログイン後にコピー

メモ化により、大規模なデータセットや複雑な UI 更新を伴うシナリオのパフォーマンスが向上し、React アプリの応答性が確保されます。

結論

React 設計パターン をマスターすることは、スケーラブルで保守可能、効率的なアプリケーションを構築するための鍵です。 コンテナおよびプレゼンテーション コンポーネントカスタム フックメモ化 などのパターンを適用することで、開発を合理化し、コードの再利用性を向上させ、パフォーマンスを向上させることができます。 高次コンポーネント複合コンポーネントプロバイダー パターンなどの高度なパターンにより、複雑な状態管理とコンポーネントの相互作用がさらに簡素化されます。

これらのパターンは単なる理論的なものではなく、React 開発における現実世界の課題に対処し、クリーンでモジュール化されたコードを作成するのに役立ちます。これらのパターンをプロジェクトに組み込んで、堅牢で拡張が容易で、長期にわたって保守可能なアプリケーションを作成してください。ツールキットに React デザイン パターンが含まれていると、どんなに複雑でも、あらゆるプロジェクトに取り組む準備が整います。
さらに詳しい情報については、Patterns.dev の React Design Patterns ドキュメントをご覧ください。

以上がReact デザイン パターン: スケーラブルなアプリケーションのベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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