Корзина — неотъемлемая часть любого интернет-магазина. Это позволяет клиентам хранить и покупать продукты.
В приложении электронной коммерции Next.js вы можете использовать Context API и хук useReducer для создания корзины. API контекста упрощает совместное использование данных корзины между компонентами, в то время как useReducer обрабатывает состояние корзины.
Создание страницы продукта
В папке pages создайте новый файл с именем Product.jsx, отображающий один продукт.
экспортпо умолчаниюфункцияПродукт({идентификатор, имя, цена}) {
возвращаться (
{имя}</p>
{цена}</p>
Компонент продукта принимает идентификатор, имя и цену продукта и отображает их. Также есть кнопка «Добавить в корзину».
Когда товар уже добавлен в корзину, кнопка должна переключиться на кнопку «Удалить из корзины», а если товара нет в корзине, на странице должна отображаться кнопка «Добавить в корзину».
Чтобы реализовать эту функцию, вам нужно будет отслеживать товары в корзине. используя контекстный API и хук useReducer.
Создание корзины покупок с помощью контекстного API
API контекста позволяет вам обмениваться данными между различными компонентами без необходимости вручную передавать реквизиты от родителя к дочернему. Этими компонентами могут быть панель навигации, страница сведений о продукте или страница оформления заказа.
Создайте новый файл с именем cartContext.js в папке с именем context и создайте контекст.
Импортировать {создатьконтекст} от"реагировать";
экспортконстанта КорзинаКонтекст = создатьКонтекст({
предметы: [],
});
CartContext принимает массив элементов в качестве значения по умолчанию.
Затем создайте поставщика контекста. Поставщик контекста позволяет компонентам, использующим контекст, подписываться на изменения контекста.
В новую функцию с именем cartProvider добавьте следующее:
экспортконстанта Поставщик карт = ({ дети }) => {
возвращаться<КорзинаКонтекст. Провайдер>{дети}КорзинаКонтекст. Провайдер>;
};
Чтобы отслеживать товары в корзине, вы будете использовать хук useReducer.
Хук useReducer работает так же, как хук useState, за исключением того, что он помогает управлять более сложной логикой состояния. Он принимает функцию редуктора и начальное состояние. Он возвращает текущее состояние и функцию отправки, которая передает действие функции редуктора.
Создайте новую функцию CartReducer и добавьте редюсер.
константа корзина Редьюсер = (состояние, действие) => {
константа {тип, полезная нагрузка} = действие;выключатель (тип) {
случай"ДОБАВЛЯТЬ":
возвращаться {
...состояние,
предметы: полезная нагрузка.элементы,
};случай"УДАЛЯТЬ":
возвращаться {
...состояние,
предметы: полезная нагрузка.элементы,
};
по умолчанию:
бросатьновыйОшибка(«Нет случая для этого типа»);
}
};
Функция редуктора содержит оператор switch, который обновляет состояние в зависимости от типа действия. Функция уменьшения корзины имеет действия «ДОБАВИТЬ» и «УДАЛИТЬ», которые добавляют в корзину и удаляют из корзины соответственно.
После создания функции редуктора используйте ее в хуке useReducer. Начните с создания функции CartProvider. Это функция, которая будет предоставлять контекст другим компонентам.
экспортконстанта Поставщик карт = ({дети}) => {
возвращаться<КорзинаКонтекст. Провайдер>{дети}КорзинаКонтекст. Провайдер>;
}
Затем создайте хук useReducer.
экспортконстанта Поставщик карт = ({ дети }) => {
константа [состояние, отправка] = useReducer (cartReducer, { предметы: [] });
возвращаться<КорзинаКонтекст. Провайдер>{дети}КорзинаКонтекст. Провайдер>;
};
Функция отправки отвечает за обновление состояния корзины, поэтому измените функцию CartProvider, включив в нее функции, которые отправляют товары в хук useReducer при обновлении корзины.
Импортировать { createContext, useReducer } от"реагировать";
экспортконстанта Поставщик карт = ({ дети }) => {
константа [состояние, отправка] = useReducer (cartReducer, initialState);константа добавить в корзину = (продукт) => {
константа updatedCart = [...state.items, product];отправлять({
тип: "ДОБАВЛЯТЬ",
полезная нагрузка: {
предметы: обновленная корзина,
},
});
};константа удалить из корзины = (идентификатор) => {
константа updatedCart = состояние.элементы.фильтр(
(currentProduct) => currentProduct.id !== id
);отправлять({
тип: "УДАЛЯТЬ",
полезная нагрузка: {
предметы: обновленная корзина,
},
});
};
возвращаться<КорзинаКонтекст. Провайдер>{дети}КорзинаКонтекст. Провайдер>;
};
Функция addToCart добавляет новый продукт к существующим продуктам и возвращает обновленные продукты в объекте полезной нагрузки функции отправки. Аналогичным образом функция removeFromCart отфильтровывает товар по идентификатору и возвращает обновленный список.
Вам также необходимо вернуть свойство value в поставщике CartContext.
экспортконстанта Поставщик карт = ({ дети }) => {
константа [состояние, отправка] = useReducer (cartReducer, {
предметы: [],
});константа добавить в корзину = (продукт) => {};
константа удалить из корзины = (идентификатор) => {};константа значение = {
предметы: гос.предметы,
добавить в корзину,
удалить из корзины,
};
возвращаться<КорзинаКонтекст. Провайдерценить={ценить}>{дети}КорзинаКонтекст. Провайдер>;
}
Свойство value потребляется через хук useContext.
Использование контекста корзины
Итак, вы создали контекст корзины и создали функцию useReducer, которая обновляет корзину. Далее вы будете использовать контекст корзины в компоненте продукта, используя хук useContext.
Начните с обертывания index.js, верхнего компонента, поставщиком контекста, чтобы сделать значения контекста доступными для всего приложения.
Импортировать {КартПровайдер} от"../контекст/контекст корзины";
функцияМое приложение({Компонент, pageProps}) {
возвращаться (
</CartProvider>
);
}
экспортпо умолчанию мое приложение;
Затем импортируйте хук useContext и поставщика контекста корзины в Product.js.
Импортировать {использоватьконтекст} от"реагировать"
Импортировать {Контекст корзины} от"../контекст/контекст корзины"экспортпо умолчаниюфункцияПродукт() {
константа {items, addToCart, removeFromCart} = useContext (CartContext)
возвращаться (
<>{имя}</p>
{цена}</p>
Функция кнопки зависит от того, находится ли товар уже в корзине. Если товар есть в корзине, кнопка должна удалить его из корзины, а если товара еще нет в корзине, она должна его добавить. Это означает, что вы должны отслеживать состояние элемента, используя useEffect и useState. Код useEffect проверяет, находится ли элемент в корзине после рендеринга компонента, в то время как useState обновляет состояние элемента.
константа [существует, setExists] = useState(ЛОЖЬ);
использоватьЭффект(() => {
константа inCart = товары.найти((элемент) => идентификатор элемента.id);
если (в корзине) {
установитьсуществует(истинный);
} еще {
установитьсуществует(ЛОЖЬ);
}
}, [элементы, идентификатор]);
Сейчас, использовать условный рендеринг чтобы показать кнопку на основе существующего состояния.
возвращаться (
{имя}</p>
{цена}</p>
{
существует
? <кнопкапо щелчку={() => removeFromCart (id)}>Удалить из корзиныкнопка>
: <кнопкапо щелчку={() => addToCart({id, name, price})}>Добавить в корзинукнопка>
}
</div>
)
Обратите внимание, что функции обработчика onClick — это функции removeFromCart и addToCart, определенные в поставщике контекста.
Добавление дополнительных функций в корзину
Вы узнали, как создать корзину с помощью контекстного API и хука useReducer.
Несмотря на то, что в этом руководстве рассматриваются только функции добавления и удаления, вы можете использовать те же концепции для добавления дополнительных функций, таких как настройка количества товаров в корзине. Важнейшим моментом является понимание контекстного API и того, как использовать хуки для обновления сведений о корзине.