亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ホームページ ウェブフロントエンド jsチュートリアル React での useContext と useReducer による狀態(tài)管理: グローバル ショッピング カートの構(gòu)築

React での useContext と useReducer による狀態(tài)管理: グローバル ショッピング カートの構(gòu)築

Nov 11, 2024 pm 02:38 PM

State Management with useContext and useReducer in React: Building a Global Shopping Cart

React の useContext と useReducer を使用した高度な狀態(tài)管理: グローバル ショッピング カートの構(gòu)築

前の記事では、React アプリケーションでグローバル狀態(tài)を効果的に管理するために useContext と useReducer を組み合わせる概念を紹介しました。シンプルな To-Do リストを作成することでこれを?qū)g証しました。ここで、さらに一歩進(jìn)んで、これらの概念をより複雑な現(xiàn)実世界の例であるグローバル ショッピング カートに適用します。

このガイドでは、アプリケーションのスケーラビリティとパフォーマンスを維持しながら、項(xiàng)目の追加、更新、削除、合計(jì)の計(jì)算など、複數(shù)の狀態(tài)とアクションを管理する方法について説明します。

この第 2 部では、次のことを?qū)Wびます:

  1. useReducer を使用して、より複雑な狀態(tài)を処理します
  2. 柔軟なコンテキスト プロバイダーを作成して、狀態(tài)とアクションをグローバルに管理します。
  3. 高度なリデューサー関數(shù)を?qū)g裝します。計(jì)算を?qū)g行し、さまざまなタイプのアクションを処理します。
  4. メモ化を使用してコンポーネントのパフォーマンスを最適化し、パフォーマンスを向上させます。

飛び込んでみましょう!


プロジェクトの概要: グローバル ショッピング カート

ショッピング カート アプリケーションには以下が含まれます:

  • 製品リスト: カートに追加できるアイテムのセット。
  • カート機(jī)能: ユーザーはカート內(nèi)のアイテムを追加、更新、削除できます。
  • カート合計(jì): アイテムの合計(jì)と合計(jì)価格を計(jì)算して表示します。

まずコンテキストとリデューサーを設(shè)定してから、機(jī)能を紹介するコンポーネントを構(gòu)築します。

セットアップと初期ファイル

まず、React プロジェクトを初期化し、基本的なフォルダー構(gòu)造をセットアップします。

src/
├── CartContext.js
├── CartProvider.js
├── ProductList.js
├── Cart.js
└── App.js

ステップ 1: 初期狀態(tài)とリデューサを作成する

空のカートとサンプル製品のセットを表す初期狀態(tài)から始めます。

初期狀態(tài):

// Initial state structure
const initialState = {
  products: [
    { id: 1, name: "Product A", price: 30 },
    { id: 2, name: "Product B", price: 20 },
    { id: 3, name: "Product C", price: 50 }
  ],
  cart: [],
  totalItems: 0,
  totalPrice: 0
};

レデ??ューサー関數(shù):

アイテムの追加、アイテム數(shù)量の更新、アイテムの削除、合計(jì)の計(jì)算などのさまざまなアクションを処理するために、cartReducer 関數(shù)をセットアップします。

src/
├── CartContext.js
├── CartProvider.js
├── ProductList.js
├── Cart.js
└── App.js

説明

  • ADD_TO_CART: アイテムをカートに追加し、すでに存在する場(chǎng)合は數(shù)量を増やします。
  • REMOVE_FROM_CART: ID に基づいてアイテムを削除します。
  • UPDATE_QUANTITY: カート內(nèi)の商品の數(shù)量を更新します。
  • CALCULATE_TOTALS: カートの合計(jì)アイテム數(shù)と合計(jì)価格を計(jì)算します。

ステップ 2: コンテキストとプロバイダーを作成する

次に、狀態(tài)を渡して関數(shù)をグローバルにディスパッチするためのコンテキストとプロバイダーを作成します。これにより、すべてのコンポーネントがカートの狀態(tài)とアクションにアクセスできるようになります。

CartContext.js

// Initial state structure
const initialState = {
  products: [
    { id: 1, name: "Product A", price: 30 },
    { id: 2, name: "Product B", price: 20 },
    { id: 3, name: "Product C", price: 50 }
  ],
  cart: [],
  totalItems: 0,
  totalPrice: 0
};

ステップ 3: コンポーネントの構(gòu)築

プロバイダーとコンテキストを設(shè)定したら、製品リストカート のコンポーネントを作成できるようになりました。


ProductList コンポーネント

ProductList コンポーネントは利用可能な製品のリストを表示し、ユーザーが製品をカートに追加できるようにします。

ProductList.js

function cartReducer(state, action) {
  switch (action.type) {
    case "ADD_TO_CART": {
      const item = state.cart.find(item => item.id === action.payload.id);
      const updatedCart = item
        ? state.cart.map(cartItem =>
            cartItem.id === item.id
              ? { ...cartItem, quantity: cartItem.quantity + 1 }
              : cartItem
          )
        : [...state.cart, { ...action.payload, quantity: 1 }];

      return { ...state, cart: updatedCart };
    }

    case "REMOVE_FROM_CART": {
      const updatedCart = state.cart.filter(item => item.id !== action.payload);
      return { ...state, cart: updatedCart };
    }

    case "UPDATE_QUANTITY": {
      const updatedCart = state.cart.map(item =>
        item.id === action.payload.id
          ? { ...item, quantity: action.payload.quantity }
          : item
      );
      return { ...state, cart: updatedCart };
    }

    case "CALCULATE_TOTALS": {
      const { totalItems, totalPrice } = state.cart.reduce(
        (totals, item) => {
          totals.totalItems += item.quantity;
          totals.totalPrice += item.price * item.quantity;
          return totals;
        },
        { totalItems: 0, totalPrice: 0 }
      );
      return { ...state, totalItems, totalPrice };
    }

    default:
      return state;
  }
}

カートコンポーネント

カート コンポーネントは、カート內(nèi)のアイテムを表示し、數(shù)量の更新、アイテムの削除を可能にし、合計(jì)アイテムと価格を表示します。

Cart.js

import React, { createContext, useReducer } from 'react';

export const CartContext = createContext();

export function CartProvider({ children }) {
  const [state, dispatch] = useReducer(cartReducer, initialState);

  return (
    <CartContext.Provider value={{ state, dispatch }}>
      {children}
    </CartContext.Provider>
  );
}

説明

  • handleRemove: カートから商品を削除します。
  • handleUpdateQuantity: 選択したアイテムの數(shù)量を更新します。
  • 合計(jì)アイテムと価格: カート コンポーネントには、州で計(jì)算された値に基づいて合計(jì)アイテムと価格が表示されます。

ステップ 4: プロバイダーでアプリをラップする

すべてのコンポーネントがカートの狀態(tài)にアクセスできるようにするには、アプリ全體を CartProvider でラップします。

App.js

import React, { useContext } from 'react';
import { CartContext } from './CartContext';

function ProductList() {
  const { state, dispatch } = useContext(CartContext);

  const handleAddToCart = (product) => {
    dispatch({ type: "ADD_TO_CART", payload: product });
    dispatch({ type: "CALCULATE_TOTALS" });
  };

  return (
    <div>
      <h2>Products</h2>
      <ul>
        {state.products.map(product => (
          <li key={product.id}>
            {product.name} - ${product.price}
            <button onClick={() => handleAddToCart(product)}>Add to Cart</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default ProductList;

最後の仕上げ: メモ化と最適化

アプリケーションが成長(zhǎng)するにつれて、パフォーマンスの最適化が不可欠になります。ここにいくつかのヒントがあります:

  1. コンポーネントのメモ化: React.memo を使用して、狀態(tài)に依存するコンポーネントの不必要な再レンダリングを防ぎます。
  2. コンテキストの分離: 製品コンテキストとカート コンテキストが大きすぎる場(chǎng)合は、よりターゲットを絞った狀態(tài)更新を可能にするために分離することを検討してください。

要約と結(jié)論

この上級(jí)ガイドでは、useContext と useReducer を使用してグローバル ショッピング カートを管理しました。主な要點(diǎn)は次のとおりです:

  1. 複雑な狀態(tài)管理: useReducer は、複雑なアクションと計(jì)算の管理を簡(jiǎn)素化します。
  2. useContext を使用したグローバル狀態(tài): コンポーネント ツリー全體で狀態(tài)にアクセスできるようにします。
  3. スケーラブルなパターン: コンテキスト內(nèi)の狀態(tài)とアクションを分離することで、よりクリーンでモジュール化されたコードが可能になります。

このアプローチをプロジェクトに適用して、アプリケーションのスケーラビリティとパフォーマンスがどのように向上するかを確認(rèn)してください。コーディングを楽しんでください! ?

以上がReact での useContext と useReducer による狀態(tài)管理: グローバル ショッピング カートの構(gòu)築の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

node.jsでHTTPリクエストを作成する方法は? node.jsでHTTPリクエストを作成する方法は? Jul 13, 2025 am 02:18 AM

node.jsでHTTPリクエストを開(kāi)始するには、組み込みモジュール、axios、およびnode-fetchを使用する3つの一般的な方法があります。 1.依存関係のない內(nèi)蔵http/httpsモジュールを使用します。これは基本的なシナリオに適していますが、https.get()を使用してデータを取得したり、.write()を介してPOSTリクエストを送信するなど、データステッチとエラーモニタリングの手動(dòng)処理が必要です。 2.Axiosは、約束に基づいたサードパーティライブラリです。簡(jiǎn)潔な構(gòu)文と強(qiáng)力な機(jī)能を備えており、非同期/待ち聲、自動(dòng)JSON変換、インターセプターなどをサポートします。非同期リクエスト操作を簡(jiǎn)素化することをお?jiǎng)幛幛筏蓼埂?3.Node-Fetchは、約束と単純な構(gòu)文に基づいて、ブラウザフェッチに似たスタイルを提供します

JavaScriptデータ型:プリミティブ対參照 JavaScriptデータ型:プリミティブ対參照 Jul 13, 2025 am 02:43 AM

JavaScriptデータ型は、プリミティブタイプと參照タイプに分割されます。プリミティブタイプには、文字列、數(shù)字、ブール、ヌル、未定義、シンボルが含まれます。値は不変であり、コピーは値を割り當(dāng)てるときにコピーされるため、互いに影響を與えません。オブジェクト、配列、関數(shù)などの參照タイプはメモリアドレスを保存し、同じオブジェクトを指す変數(shù)は互いに影響します。 TypeofとInstanceOFを使用してタイプを決定できますが、TypeOfNullの歴史的な問(wèn)題に注意してください。これらの2種類の違いを理解することは、より安定した信頼性の高いコードを書(shū)くのに役立ちます。

JavaScript Timeオブジェクト、誰(shuí)かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 JavaScript Timeオブジェクト、誰(shuí)かがEACTEXE、Google Chromeなどのより高速なWebサイトを構(gòu)築します。 Jul 08, 2025 pm 02:27 PM

こんにちは、JavaScript開(kāi)発者!今週のJavaScriptニュースへようこそ!今週は、DenoとのOracleの商標(biāo)紛爭(zhēng)、新しいJavaScript Timeオブジェクトがブラウザ、Google Chromeアップデート、およびいくつかの強(qiáng)力な開(kāi)発ツールによってサポートされています。始めましょう! 「JavaScript」の商標(biāo)を登録しようとするDeno Oracleの試みとのOracleの商標(biāo)紛爭(zhēng)は、論爭(zhēng)を引き起こしました。 Node.jsとDenoの作成者であるRyan Dahlは、商標(biāo)をキャンセルするために請(qǐng)願(yuàn)書(shū)を提出しました。

キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? キャッシュAPIとは何ですか?また、サービスワーカーでどのように使用されますか? Jul 08, 2025 am 02:43 AM

Cacheapiは、ブラウザからネットワークリクエストをキャッシュするツールです。これは、ウェブサイトのパフォーマンスとオフラインエクスペリエンスを改善するために、サービスワーカーと併用することがよくあります。 1.開(kāi)発者は、スクリプト、スタイルシート、寫(xiě)真などのリソースを手動(dòng)で保存できるようにします。 2。要求に応じてキャッシュ応答と一致させることができます。 3.特定のキャッシュの削除またはキャッシュ全體のクリアをサポートします。 4.フェッチイベントを聞いているサービスワーカーを介して、キャッシュの優(yōu)先順位またはネットワークの優(yōu)先戦略を?qū)g裝できます。 5.オフラインサポート、繰り返しのアクセス速度の高速化、主要なリソースのプリロード、バックグラウンドアップデートコンテンツによく使用されます。 6.それを使用する場(chǎng)合、キャッシュバージョンの制御、ストレージ制限、およびHTTPキャッシングメカニズムとの違いに注意する必要があります。

ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ ハンドリングの約束:javascriptのチェーン、エラー処理、および約束の組み合わせ Jul 08, 2025 am 02:40 AM

約束は、JavaScriptで非同期操作を処理するためのコアメカニズムです。チェーンコール、エラー処理、コンビナーの理解は、アプリケーションをマスターするための鍵です。 1.チェーンコールは、.then()を通じて新しい約束を返し、非同期プロセスの連結(jié)を?qū)g現(xiàn)します。それぞれ.then()は以前の結(jié)果を受け取り、値または約束を返すことができます。 2。エラー処理は、.catch()を使用して例外をキャッチしてサイレント障害を回避し、キャッチのデフォルト値を返すためにプロセスを継続する必要があります。 3。promise.all()などの組み合わせ(すべての成功後にのみ成功しました)、promise.race()(最初の完了が返されます)、promise.allsettled()(すべての完了を待っています)

JavaScriptでのデータ操作のためのArray.Prototypeメソッドを活用します JavaScriptでのデータ操作のためのArray.Prototypeメソッドを活用します Jul 06, 2025 am 02:36 AM

.map()、.filter()、.reduce()などのJavaScriptアレイ內(nèi)蔵メソッドは、データ処理を簡(jiǎn)素化できます。 1).map()は、要素を1つに変換して新しい配列を生成するために使用されます。 2).filter()は、條件ごとに要素をフィルタリングするために使用されます。 3).reduce()は、データを単一の値として集約するために使用されます。使用すると誤用を避ける必要があり、その結(jié)果、副作用やパフォーマンスの問(wèn)題が発生します。

JSラウンドアップ:JavaScriptイベントループに深く潛り込む JSラウンドアップ:JavaScriptイベントループに深く潛り込む Jul 08, 2025 am 02:24 AM

JavaScriptのイベントループは、コールスタック、WebAPIS、およびタスクキューを調(diào)整することにより、非同期操作を管理します。 1.コールスタックは同期コードを?qū)g行し、非同期タスクに遭遇すると、処理のためにWebAPIに引き渡されます。 2。WebAPIがバックグラウンドでタスクを完了した後、コールバックを?qū)潖辘工毳濠`(マクロタスクまたはマイクロタスク)に入れます。 3.イベントループは、コールスタックが空であるかどうかをチェックします??栅螆?chǎng)合、コールバックはキューから取り出され、実行のためにコールスタックに押し込まれます。 4.マイクロタスク(Promise.thenなど)は、マクロタスク(SettimeOutなど)より優(yōu)先されます。 5.イベントループを理解するには、メインスレッドのブロックを避け、コード実行順序を最適化するのに役立ちます。

JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 JavaScript DOMイベントでのイベントの泡立ちとキャプチャの理解 Jul 08, 2025 am 02:36 AM

イベントの泡は、ターゲット要素から祖先ノードに外側(cè)に伝播し、イベントキャプチャは外側(cè)の層からターゲット要素に內(nèi)側(cè)に伝播します。 1。イベントバブル:子要素をクリックした後、イベントは親要素のリスナーを上向きにトリガーします。たとえば、ボタンをクリックした後、最初に保育を出してから、親クリックしました。 2。イベントキャプチャ:3番目のパラメーターをtrueに設(shè)定して、リスナーが[親子要素のキャプチャリスナー]をクリックする前に[親要素のキャプチャリスナーをトリガーするなど、キャプチャステージで実行されるようにします。 3.実用的な用途には、子どもの要素イベントの統(tǒng)一された管理、傍受前処理、パフォーマンスの最適化が含まれます。 4. DOMイベントストリームは、キャプチャ、ターゲット、バブルの3つの段階に分割され、デフォルトのリスナーはバブルステージで実行されます。

See all articles