Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

Košarica za kupnju bitan je dio svake web-lokacije za e-trgovinu. Kupcima omogućuje skladištenje i kupnju proizvoda.

U aplikaciji za e-trgovinu Next.js možete koristiti Context API i useReducer kuku za izradu košarice. API konteksta pojednostavljuje dijeljenje podataka o košarici između komponenti dok useReducer upravlja stanjem košarice.

Izrada stranice proizvoda

U mapi stranica stvorite novu datoteku pod nazivom Product.jsx koja prikazuje jedan proizvod.

izvozzadanofunkcijaProizvod({id, ime, cijena}) {
povratak (

{name}</p>

{cijena}</p>

Komponenta proizvoda prihvaća ID, naziv i cijenu proizvoda i prikazuje ih. Također ima gumb "Dodaj u košaricu".

Kada je proizvod već dodan u košaricu, gumb bi se trebao prebaciti na gumb "ukloni iz košarice", a ako proizvod nije u košarici, stranica bi trebala prikazati gumb "Dodaj u košaricu".

Da biste implementirali ovu funkciju, morat ćete pratiti stavke u košarici

instagram viewer
koristeći kontekstualni API i useReducer kuka.

Stvaranje košarice za kupnju pomoću Context API-ja

Kontekstni API omogućuje vam dijeljenje podataka između različitih komponenti bez potrebe za ručnim prijenosom rekvizita od roditelja do djeteta. Te komponente mogu biti navigacijska traka, stranica s pojedinostima o proizvodu ili stranica za naplatu.

Napravite novu datoteku pod nazivom cartContext.js u mapi pod nazivom context i stvorite kontekst.

uvoz {stvori kontekst} iz"reagirati";

izvozkonst CartContext = createContext({
stavke: [],
});

CartContext uzima niz stavki kao zadanu vrijednost.

Zatim stvorite pružatelja konteksta. Davatelj konteksta omogućuje komponentama koje konzumiraju kontekst pretplatu na promjene konteksta.

U novoj funkciji pod nazivom cartProvider dodajte sljedeće:

izvozkonst CartProvider = ({ djeca }) => {
povratak<CartContext. Davatelj>{djeca}CartContext. Davatelj>;
};

Da biste pratili artikle u košarici, koristit ćete kuku useReducer.

UseReducer hook radi kao useState hook osim što pomaže u upravljanju složenijom logikom stanja. Prihvaća reduktorsku funkciju i početno stanje. Vraća trenutno stanje i funkciju otpremanja koja prosljeđuje radnju funkciji reduktora.

Napravite novu funkciju pod nazivom CartReducer i dodajte reduktor.

konst cartReducer = (stanje, djelovanje) => {
konst { vrsta, nosivost } = akcija;

sklopka (tip) {
slučaj"DODATI":
povratak {
...država,
stavke: nosivost.stavke,
};

slučaj"UKLONITI":
povratak {
...država,
stavke: nosivost.stavke,
};

zadano:
bacanjenoviGreška("Nema futrole za tu vrstu");
}
};

Funkcija reduktora sadrži naredbu switch koja ažurira stanje ovisno o vrsti akcije. Funkcija reduktora kolica ima akcije "DODAJ" i "UKLONI" koje dodaju u košaricu odnosno uklanjaju iz košarice.

Nakon što stvorite funkciju reduktora, upotrijebite ga u kuki useReducer. Započnite stvaranjem funkcije CartProvider. Ovo je funkcija koja će pružiti kontekst drugim komponentama.

izvozkonst CartProvider = ({djeca}) => {
povratak<CartContext. Davatelj>{djeca}CartContext. Davatelj>;
}

Zatim izradite kuku useReducer.

izvozkonst CartProvider = ({ djeca }) => {
konst [stanje, otprema] = useReducer (cartReducer, { stavke: [] });
povratak<CartContext. Davatelj>{djeca}CartContext. Davatelj>;
};

Funkcija otpreme odgovorna je za ažuriranje stanja košarice, stoga modificirajte funkciju CartProvider da uključi funkcije koje šalju proizvode na useReducer kuku kada se košarica ažurira.

uvoz { createContext, useReducer } iz"reagirati";

izvozkonst CartProvider = ({ djeca }) => {
konst [stanje, otprema] = useReducer (cartReducer, initialState);

konst dodaj u košaricu = (proizvod) => {
konst updatedCart = [...state.items, product];

otprema ({
tip: "DODATI",
nosivost: {
stavke: ažurirana košarica,
},
});
};

konst removeFromCart = (iskaznica) => {
konst updatedCart = state.items.filter(
(currentProduct) => currentProduct.id !== id
);

otprema ({
tip: "UKLONITI",
nosivost: {
stavke: ažurirana košarica,
},
});
};

povratak<CartContext. Davatelj>{djeca}CartContext. Davatelj>;
};

Funkcija addToCart dodaje novi proizvod postojećim proizvodima i vraća ažurirane proizvode u objekt nosivosti funkcije otpreme. Isto tako, funkcija removeFromCart filtrira stavku prema ID-u i vraća ažurirani popis.

Također morate vratiti vrijednost prop u pružatelju CartContext.

izvozkonst CartProvider = ({ djeca }) => {
konst [stanje, otprema] = useReducer (cartReducer, {
stavke: [],
});

konst dodaj u košaricu = (proizvod) => {};
konst removeFromCart = (iskaznica) => {};

konst vrijednost = {
stavke: stanje.stavke,
Dodaj u košaricu,
removeFromCart,
};

povratak<CartContext. Davateljvrijednost={vrijednost}>{djeca}CartContext. Davatelj>;
}

Prop vrijednosti konzumira se putem kuke useContext.

Konzumiranje konteksta košarice

Do sada ste stvorili kontekst košarice i izradili funkciju useReducer koja ažurira košaricu. Zatim ćete iskoristiti kontekst košarice u komponenti proizvoda pomoću kuke useContext.

Započnite omotavanjem index.js, gornje komponente, s pružateljem konteksta kako bi vrijednosti konteksta bile dostupne u cijeloj aplikaciji.

uvoz { CartProvider } iz"../context/cartContext";

funkcijaMyApp({ Komponenta, pageProps }) {
povratak (


</CartProvider>
);
}

izvozzadano MyApp;

Zatim uvezite useContext hook i pružatelja konteksta košarice u Product.js

uvoz {useContext} iz"reagirati"
uvoz {Kontekst košarice} iz"../context/cartContext"

izvozzadanofunkcijaProizvod() {
konst {items, addToCart, removeFromCart} = useContext (CartContext)

povratak (
<>


{name}</p>

{cijena}</p>

Funkcija gumba ovisi o tome nalazi li se artikl već u košarici. Ako artikl postoji u košarici, gumb bi ga trebao ukloniti iz košarice, a ako artikl već nije u košarici, trebao bi ga dodati. To znači da morate pratiti stanje stavke koristeći useEffect i useState. Kod useEffect provjerava je li artikl u košarici nakon renderiranja komponente dok useState ažurira stanje artikla.

konst [postoji, setPostoji] = useState(lažno);

useEffect(() => {
konst inCart = items.find((artikal) => item.id id);

ako (u košarici) {
setPostoji(pravi);
} drugo {
setPostoji(lažno);
}
}, [stavke, id]);

Sada, koristiti uvjetno prikazivanje za prikaz gumba na temelju postojećeg stanja.

povratak (

{name}</p>

{cijena}</p>
{
postoji
? <dugmena klik={() => removeFromCart (id)}>Ukloni iz košaricedugme>
: <dugmena klik={() => addToCart({id, name, price})}>Dodaj u košaricudugme>
}
</div>
)

Imajte na umu da su funkcije rukovatelja onClick funkcije removeFromCart i addToCart definirane u pružatelju konteksta.

Dodavanje više funkcionalnosti u košaricu

Naučili ste kako izraditi košaricu za kupnju pomoću kontekstualnog API-ja i kuke useReducer.

Iako je ovaj vodič pokrivao samo funkciju dodavanja i uklanjanja, možete koristiti iste koncepte za dodavanje više značajki kao što je prilagođavanje količina stavki u košarici. Ključno je razumijevanje kontekstnog API-ja i kako koristiti kuke za ažuriranje pojedinosti o košarici.