


Pengurusan Negeri dengan useContext dan useReducer in React: Membina Troli Beli-belah Global
Nov 11, 2024 pm 02:38 PMPengurusan Negeri Lanjutan dengan useContext dan useReducer in React: Membina Troli Beli-belah Global
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:
- Kendalikan keadaan yang lebih kompleks menggunakan useReducer.
- Buat penyedia konteks yang fleksibel untuk mengurus keadaan dan tindakan secara global.
- Laksanakan fungsi pengurang lanjutan untuk melaksanakan pengiraan dan mengendalikan pelbagai jenis tindakan.
- Optimumkan prestasi komponen dengan memoisasi untuk prestasi yang lebih baik.
Jom selami!
Gambaran Keseluruhan Projek: Troli Beli-belah Global
Aplikasi troli beli-belah kami akan mempunyai:
- Senarai Produk: Satu set item tersedia untuk ditambahkan pada troli.
- Fungsi Troli: Pengguna boleh menambah, mengemas kini dan mengalih keluar item dalam troli.
- Jumlah Troli: Kira dan paparkan jumlah item dan jumlah harga.
Kami akan mulakan dengan menyediakan konteks dan pengurang, kemudian membina komponen untuk mempamerkan ciri.
Persediaan dan Fail Permulaan
Untuk bermula, mulakan projek React anda dan sediakan struktur folder asas:
src/ ├── CartContext.js ├── CartProvider.js ├── ProductList.js ├── Cart.js └── App.js
Langkah 1: Buat Keadaan Awal dan Pengurangan
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
Penjelasan
- ADD_TO_CART: Menambahkan item pada troli, meningkatkan kuantiti jika ia sudah wujud.
- REMOVE_FROM_CART: Mengalih keluar item berdasarkan IDnya.
- KUANTITI_KEMASKINI: Mengemas kini kuantiti item dalam troli.
- KIRA_JUMLAH: Mengira jumlah bilangan item dan jumlah harga troli.
Langkah 2: Cipta Konteks dan Pembekal
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 };
Langkah 3: Membina Komponen
Dengan penyediaan dan konteks disediakan, kami kini boleh mencipta komponen untuk Senarai Produk dan Troli.
Komponen Senarai Produk
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
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> ); }
Penjelasan
- handleRemove: Mengalih keluar item daripada troli.
- handleUpdateQuantity: Mengemas kini kuantiti item yang dipilih.
- Jumlah Item dan Harga: Komponen troli memaparkan jumlah item dan harga berdasarkan nilai yang dikira dalam negeri.
Langkah 4: Balut Apl dengan Pembekal
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;
Sentuhan Akhir: Memoisasi dan Pengoptimuman
Apabila aplikasi anda berkembang, pengoptimuman prestasi adalah penting. Berikut adalah beberapa petua:
- Komponen Memoize: Gunakan React.memo untuk mengelakkan pemaparan semula komponen yang tidak perlu yang bergantung pada keadaan.
- Konteks Asingkan: Pertimbangkan untuk mengasingkan konteks produk dan troli jika ia menjadi terlalu besar, membenarkan lebih banyak kemas kini keadaan disasarkan.
Rekap dan Kesimpulan
Dalam panduan lanjutan ini, kami menggunakan useContext dan useReducer untuk mengurus troli beli-belah global. Makanan utama termasuk:
- Pengurusan Negeri yang Kompleks: useReducer memudahkan pengurusan tindakan dan pengiraan yang rumit.
- Keadaan Global dengan useContext: Menjadikan keadaan boleh diakses merentas pepohon komponen.
- Corak Boleh Skala: Mengasingkan keadaan dan tindakan dalam konteks membolehkan kod yang lebih bersih dan modular.
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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Java dan JavaScript adalah bahasa pengaturcaraan yang berbeza, masing -masing sesuai untuk senario aplikasi yang berbeza. Java digunakan untuk pembangunan aplikasi perusahaan dan mudah alih yang besar, sementara JavaScript digunakan terutamanya untuk pembangunan laman web.

JavaScriptcommentsareessentialformaintaining,reading,andguidingcodeexecution.1)Single-linecommentsareusedforquickexplanations.2)Multi-linecommentsexplaincomplexlogicorprovidedetaileddocumentation.3)Inlinecommentsclarifyspecificpartsofcode.Bestpractic

Titik berikut harus diperhatikan apabila tarikh pemprosesan dan masa di JavaScript: 1. Terdapat banyak cara untuk membuat objek tarikh. Adalah disyorkan untuk menggunakan rentetan format ISO untuk memastikan keserasian; 2. Dapatkan dan tetapkan maklumat masa boleh diperoleh dan tetapkan kaedah, dan ambil perhatian bahawa bulan bermula dari 0; 3. Tarikh pemformatan secara manual memerlukan rentetan, dan perpustakaan pihak ketiga juga boleh digunakan; 4. Adalah disyorkan untuk menggunakan perpustakaan yang menyokong zon masa, seperti Luxon. Menguasai perkara -perkara utama ini secara berkesan dapat mengelakkan kesilapan yang sama.

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScriptispreferredforwebdevelopment, whersjavaisbetterforlarge-scalebackendsystemsandandroidapps.1) javascriptexcelsinceleatinginteractiveWebexperienceswithitsdynamicnatureanddommanipulation.2) javaoffersstrongyblectionandobjection

JavascripthassevenfundamentalDatypes: nombor, rentetan, boolean, undefined, null, objek, andsymbol.1) numberuseadouble-precisionformat, bergunaforwidevaluangesbutbecautiouswithfloating-pointarithmetic.2)

Penangkapan dan gelembung acara adalah dua peringkat penyebaran acara di Dom. Tangkap adalah dari lapisan atas ke elemen sasaran, dan gelembung adalah dari elemen sasaran ke lapisan atas. 1. Penangkapan acara dilaksanakan dengan menetapkan parameter useCapture addeventlistener kepada benar; 2. Bubble acara adalah tingkah laku lalai, useCapture ditetapkan kepada palsu atau ditinggalkan; 3. Penyebaran acara boleh digunakan untuk mencegah penyebaran acara; 4. Acara menggelegak menyokong delegasi acara untuk meningkatkan kecekapan pemprosesan kandungan dinamik; 5. Penangkapan boleh digunakan untuk memintas peristiwa terlebih dahulu, seperti pemprosesan pembalakan atau ralat. Memahami kedua -dua fasa ini membantu mengawal masa dan bagaimana JavaScript bertindak balas terhadap operasi pengguna.

Java dan JavaScript adalah bahasa pengaturcaraan yang berbeza. 1.Java adalah bahasa yang ditaip dan disusun secara statik, sesuai untuk aplikasi perusahaan dan sistem besar. 2. JavaScript adalah jenis dinamik dan bahasa yang ditafsirkan, terutamanya digunakan untuk interaksi web dan pembangunan front-end.
