Čtenáři jako vy pomáhají podporovat MUO. Když provedete nákup pomocí odkazů na našich stránkách, můžeme získat provizi přidružené společnosti. Přečtěte si více.

Nákupní košík je nezbytnou součástí každého e-shopu. Umožňuje zákazníkům skladovat a nakupovat produkty.

V aplikaci pro elektronický obchod Next.js můžete k vytvoření košíku použít kontextové rozhraní API a háček useReducer. Kontextové API zjednodušuje sdílení dat košíku mezi komponentami, zatímco useReducer zpracovává stav košíku.

Vytvoření stránky produktu

Ve složce stránek vytvořte nový soubor s názvem Product.jsx, který vykreslí jeden produkt.

vývoznívýchozífunkceProdukt({id, name, price}) {
vrátit se (

{name}</p>

{price}</p>

Komponenta produktu přijímá ID, název a cenu produktu a zobrazuje je. Má také tlačítko „Přidat do košíku“.

Když je produkt již přidán do košíku, tlačítko by se mělo přepnout na tlačítko „odebrat z košíku“ a pokud produkt v košíku není, na stránce by se mělo zobrazit tlačítko „Přidat do košíku“.

instagram viewer

Chcete-li implementovat tuto funkci, budete muset sledovat položky v košíku pomocí kontextového API a háček useReducer.

Vytvoření nákupního košíku pomocí kontextového API

Kontextové rozhraní API vám umožňuje sdílet data mezi různými komponentami, aniž byste museli ručně předávat rekvizity z rodiče na potomka. Těmito součástmi může být navigační panel, stránka s podrobnostmi o produktu nebo stránka pokladny.

Vytvořte nový soubor s názvem cartContext.js ve složce s názvem context a vytvořte kontext.

import { createContext } z"reagovat";

vývozníkonst CartContext = createContext({
položky: [],
});

CartContext má jako výchozí hodnotu pole položek.

Dále vytvořte poskytovatele kontextu. Poskytovatel kontextu umožňuje komponentám, které využívají kontext, přihlásit se k odběru změn kontextu.

V nové funkci nazvané cartProvider přidejte následující:

vývozníkonst Poskytovatel košíku = ({děti}) => {
vrátit se<Kontext košíku. Poskytovatel>{děti}Kontext košíku. Poskytovatel>;
};

Chcete-li mít přehled o položkách v košíku, použijete háček useReducer.

Hák useReducer funguje jako háček useState, ale pomáhá spravovat složitější logiku stavu. Přijímá redukční funkci a výchozí stav. Vrací aktuální stav a funkci odeslání, která předá akci redukční funkci.

Vytvořte novou funkci s názvem CartReducer a přidejte redukci.

konst cartReducer = (stav, akce) => {
konst { typ, užitečné zatížení } = akce;

přepínač (typ) {
pouzdro"PŘIDAT":
vrátit se {
...Stát,
položky: payload.items,
};

pouzdro"ODSTRANIT":
vrátit se {
...Stát,
položky: payload.items,
};

výchozí:
házetNovýChyba("Žádný případ pro tento typ");
}
};

Funkce redukce obsahuje příkaz switch, který aktualizuje stav v závislosti na typu akce. Funkce redukce košíku má akce „ADD“ a „REMOVE“, které přidávají do košíku a odebírají z košíku.

Po vytvoření funkce redukce ji použijte v háčku useReducer. Začněte vytvořením funkce CartProvider. Toto je funkce, která poskytne kontext ostatním komponentám.

vývozníkonst Poskytovatel košíku = ({děti}) => {
vrátit se<Kontext košíku. Poskytovatel>{děti}Kontext košíku. Poskytovatel>;
}

Poté vytvořte háček useReducer.

vývozníkonst Poskytovatel košíku = ({děti}) => {
konst [stav, odeslání] = useReducer (cartReducer, { položky: [] });
vrátit se<Kontext košíku. Poskytovatel>{děti}Kontext košíku. Poskytovatel>;
};

Funkce odeslání je zodpovědná za aktualizaci stavu košíku, takže upravte funkci CartProvider tak, aby zahrnovala funkce, které při aktualizaci košíku odesílají produkty na háček useReducer.

import { createContext, useReducer } z"reagovat";

vývozníkonst Poskytovatel košíku = ({děti}) => {
konst [stav, odeslání] = useReducer (cartReducer, initialState);

konst addToCart = (produkt) => {
konst updatedCart = [...stav.položky, produkt];

odeslání({
typ: "PŘIDAT",
užitečné zatížení: {
položky: aktualizovaný košík,
},
});
};

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

odeslání({
typ: "ODSTRANIT",
užitečné zatížení: {
položky: aktualizovaný košík,
},
});
};

vrátit se<Kontext košíku. Poskytovatel>{děti}Kontext košíku. Poskytovatel>;
};

Funkce addToCart připojí nový produkt ke stávajícím produktům a vrátí aktualizované produkty v objektu užitečného zatížení funkce odeslání. Podobně funkce removeFromCart odfiltruje položku podle ID a vrátí aktualizovaný seznam.

Musíte také vrátit hodnotu prop v poskytovateli CartContext.

vývozníkonst Poskytovatel košíku = ({děti}) => {
konst [stav, odeslání] = useReducer (cartReducer, {
položky: [],
});

konst addToCart = (produkt) => {};
konst removeFromCart = (id) => {};

konst hodnota = {
položky: state.items,
přidat do košíku,
odebrat z košíku,
};

vrátit se<Kontext košíku. Poskytovatelhodnota={hodnota}>{děti}Kontext košíku. Poskytovatel>;
}

Hodnota prop je spotřebována prostřednictvím háku useContext.

Konzumace kontextu košíku

Doposud jste vytvořili kontext košíku a vytvořili funkci useReducer, která aktualizuje košík. Dále použijete kontext košíku v komponentě produktu pomocí háčku useContext.

Začněte tím, že zabalíte index.js, nejvyšší komponentu, do poskytovatele kontextu, aby byly kontextové hodnoty dostupné v celé aplikaci.

import { CartProvider } z"../context/cartContext";

funkceMoje aplikace({ Component, pageProps }) {
vrátit se (


</CartProvider>
);
}

vývoznívýchozí MyApp;

Poté importujte háček useContext a poskytovatele kontextu košíku do Product.js

import { useContext } z"reagovat"
import { CartContext } z"../context/cartContext"

vývoznívýchozífunkceProdukt() {
konst {items, addToCart, removeFromCart} = useContext (CartContext)

vrátit se (
<>


{name}</p>

{price}</p>

Funkce tlačítka závisí na tom, zda je zboží již v košíku. Pokud položka v košíku existuje, tlačítko by ji mělo z košíku odebrat a pokud položka v košíku ještě není, mělo by ji přidat. To znamená, že musíte sledovat stav položky pomocí useEffect a useState. Kód useEffect zkontroluje, zda je položka v košíku po vykreslení komponenty, zatímco useState aktualizuje stav položky.

konst [existuje, setExists] = useState(Nepravdivé);

useEffect(() => {
konst inCart = items.find((položka) => item.id id);

-li (inCart) {
setExists(skutečný);
} jiný {
setExists(Nepravdivé);
}
}, [položky, id]);

Nyní, použít podmíněné vykreslování pro zobrazení tlačítka na základě existujícího stavu.

vrátit se (

{name}</p>

{price}</p>
{
existuje
? <knoflíkpři kliknutí={() => removeFromCart (id)}>Odebrat z košíkuknoflík>
: <knoflíkpři kliknutí={() => addToCart({id, name, price})}>Přidat do košíkuknoflík>
}
</div>
)

Všimněte si, že funkcemi obsluhy onClick jsou funkce removeFromCart a addToCart definované v poskytovateli kontextu.

Přidání dalších funkcí do košíku

Naučili jste se, jak vytvořit nákupní košík pomocí kontextového rozhraní API a háčku useReducer.

I když tato příručka pokrývá pouze funkce přidávání a odebírání, můžete použít stejné koncepty k přidání dalších funkcí, jako je úprava množství položek košíku. Rozhodující je pochopení kontextového API a toho, jak používat háčky k aktualizaci podrobností košíku.