Dalam artikel sebelumnya, kami memperkenalkan konsep menggabungkan useContext dan useReducer untuk mengurus keadaan global dengan berkesan dalam aplikasi React. Kami menunjukkan ini dengan membina senarai tugasan yang mudah. Sekarang, kami akan mengambil perkara yang lebih baik dan menggunakan konsep ini pada contoh dunia sebenar yang lebih kompleks—troli beli-belah global.
Panduan ini akan merangkumi cara mengurus berbilang keadaan dan tindakan, seperti menambah, mengemas kini dan mengalih keluar item serta mengira jumlah—semuanya sambil memastikan aplikasi berskala dan berprestasi.
Dalam bahagian kedua ini, anda akan belajar untuk:
Jom selami!
Aplikasi troli beli-belah kami akan mempunyai:
Kami akan mulakan dengan menyediakan konteks dan pengurang, kemudian membina komponen untuk mempamerkan ciri.
Untuk bermula, mulakan projek React anda dan sediakan struktur folder asas:
src/ ├── CartContext.js ├── CartProvider.js ├── ProductList.js ├── Cart.js └── App.js
Kita akan mulakan dengan keadaan awal yang mewakili troli kosong dan set sampel produk.
Keadaan Awal:
// 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 };
Fungsi Pengurang:
Kami akan menyediakan fungsi cartReducer untuk mengendalikan pelbagai tindakan seperti menambah item, mengemas kini kuantiti item, mengalih keluar item dan mengira jumlah.
src/ ├── CartContext.js ├── CartProvider.js ├── ProductList.js ├── Cart.js └── App.js
Sekarang, kami akan mencipta konteks dan penyedia untuk melepasi keadaan dan fungsi penghantaran kami secara global. Ini akan membenarkan semua komponen mengakses keadaan troli dan tindakan.
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 };
Dengan penyediaan dan konteks disediakan, kami kini boleh mencipta komponen untuk Senarai Produk dan Troli.
Komponen ProductList akan memaparkan senarai produk yang tersedia dan membenarkan pengguna menambah produk pada troli.
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; } }
Komponen Troli memaparkan item dalam troli, membenarkan mengemas kini kuantiti, mengalih keluar item dan menunjukkan jumlah item dan harga.
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> ); }
Untuk memastikan semua komponen boleh mengakses keadaan troli, bungkus keseluruhan apl dalam 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;
Apabila aplikasi anda berkembang, pengoptimuman prestasi adalah penting. Berikut adalah beberapa petua:
Dalam panduan lanjutan ini, kami menggunakan useContext dan useReducer untuk mengurus troli beli-belah global. Makanan utama termasuk:
Cuba gunakan pendekatan ini pada projek anda dan lihat cara pendekatan ini meningkatkan kebolehskalaan dan prestasi aplikasi anda. Selamat mengekod! ?
Atas ialah kandungan terperinci Pengurusan Negeri dengan useContext dan useReducer in React: Membina Troli Beli-belah Global. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!