Dans l'article précédent, nous avons introduit le concept de combinaison de useContext et useReducer pour gérer efficacement l'état global dans une application React. Nous l’avons démontré en créant une simple liste de tâches. Nous allons maintenant aller plus loin et appliquer ces concepts à un exemple concret plus complexe : un panier d'achat global.
Ce guide expliquera comment gérer plusieurs états et actions, tels que l'ajout, la mise à jour et la suppression d'éléments, ainsi que le calcul des totaux, tout en gardant l'application évolutive et performante.
Dans cette deuxième partie, vous apprendrez à :
Plongeons-nous !
Notre application de panier d'achat aura :
Nous commencerons par configurer le contexte et le réducteur, puis créerons des composants pour présenter les fonctionnalités.
Pour commencer, initialisez votre projet React et configurez une structure de dossiers de base :
src/ ├── CartContext.js ├── CartProvider.js ├── ProductList.js ├── Cart.js └── App.js
Nous commencerons par un état initial qui représente un panier vide et un ensemble d'échantillons de produits.
État initial :
// 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 };
Fonction réducteur :
Nous allons configurer une fonction cartReducer pour gérer diverses actions telles que l'ajout d'articles, la mise à jour des quantités d'articles, la suppression d'articles et le calcul des totaux.
src/ ├── CartContext.js ├── CartProvider.js ├── ProductList.js ├── Cart.js └── App.js
Maintenant, nous allons créer un contexte et un fournisseur pour transmettre notre fonction d'état et de répartition à l'échelle mondiale. Cela permettra à tous les composants d'accéder à l'état et aux actions du panier.
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 };
Une fois le fournisseur et le contexte configurés, nous pouvons maintenant créer des composants pour la Liste de produits et le Panier.
Le composant ProductList affichera une liste des produits disponibles et permettra aux utilisateurs d'ajouter des produits au panier.
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; } }
Le composant Panier affiche les articles dans le panier, permet de mettre à jour les quantités, de supprimer des articles et affiche le total des articles et le prix.
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> ); }
Pour vous assurer que tous les composants peuvent accéder à l'état du panier, enveloppez l'intégralité de l'application dans 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;
À mesure que votre application se développe, l'optimisation des performances est essentielle. Voici quelques conseils :
Dans ce guide avancé, nous avons utilisé useContext et useReducer pour gérer un panier global. Les principaux points à retenir :
Essayez d'appliquer cette approche à vos projets et voyez comment elle améliore l'évolutivité et les performances de vos applications. Bon codage ! ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!