#reactjs #next.js #use-context
#reactjs #next.js #использование-контекст
Вопрос:
Я создаю довольно простой веб-сайт ресторана, используя React и Next.js . У меня есть домашняя страница и страница «заказа», которая отображает меню из объекта состояния («menuitems»). Я хочу, чтобы пользователь мог добавлять товары в свою «корзину», которая является другим объектом состояния. Итак, в конечном итоге я переношу данные из статического состояния «menuitems» в «корзину».
Чего я не могу понять, так это как я могу обновить состояние «корзины» со страницы «заказ».
Я настроил контекст для приложения, выходящего из этого руководства. Я смог успешно получить доступ к меню, используя вызов пользовательского хука ‘useAppContext ()’, но у меня больше нет доступа к функциям обновления, предоставляемым с помощью вызовов useState () или useContext (), которые я ранее использовал, когда создавал что-то подобное со всем в одном файле (вы можете увидеть вмой код ниже, где я вызываю теперь неопределенную функцию setCartItem()).
Как я могу обновить состояние ‘cartitems’ изнутри моего компонента ‘order’?
Файл, в котором у меня есть мой контекстный объект:
import { createContext, useContext } from "react";
const AppContext = createContext();
export function AppWrapper({ children }) {
const state = {
menuitems: [
{
title: "Spagett",
description: "Our finest spagett made with homemade meatballs and sauce.",
},
{
title: "Sandwich",
description: "You gotta try this sandwich",
},
{
title: "BFB",
description: "Watch out for your toilet after this one bro",
},
],
cartitems: []
}
return (
<AppContext.Provider
value={state}
>
{children}
</AppContext.Provider>
);
}
export function useAppContext() {
return useContext(AppContext);
}
Мой _app.js файл:
import "../styles/globals.css";
import { AppWrapper } from "./context/state";
function MyApp({ Component, pageProps }) {
return (
<AppWrapper>
<Component {...pageProps} />
</AppWrapper>
);
}
export default MyApp;
Наконец, мой компонент ‘order’, где я пытаюсь обновить состояние ‘cartitems’:
import Link from "next/link";
import { useAppContext } from "./context/state";
//IMPORT CONTEXT
const OrderPage = () => {
const { menuitems } = useAppContext();
const { cartitems } = useAppContext();
const renderedMenu = menuitems.map((item) => (
<div key={item.name} className="order-item">
<h4>{item.title}</h4>
<p>{item.description}</p>
<button onClick={() => setCartItem([...cartitems, item.title])}>
Add Item
</button>
</div>
));
return (
<div>
<Link href="/">
<a>Go home</a>
</Link>
<div>{renderedMenu}</div>
</div>
);
};
export default OrderPage;
Комментарии:
1. Можете ли вы добавить вопрос в конец своего сообщения? С какой реальной проблемой вы столкнулись?
2. @julian добавил мой вопрос жирным шрифтом
Ответ №1:
Создайте состояние в своем провайдере, затем передайте setCartItems в свой контекст.
export function AppWrapper({ children }) {
const [ cartItems, setCardItems ] = useState([])
const state = {
menuitems: [
{
title: "Spagett",
description: "Our finest spagett made with homemade meatballs and sauce.",
},
{
title: "Sandwich",
description: "You gotta try this sandwich",
},
{
title: "BFB",
description: "Watch out for your toilet after this one bro",
},
],
cartitems: []
}
return (
<AppContext.Provider
value={{ state, cartItems, setCardItems }}
>
{children}
</AppContext.Provider>
);
}
Затем вы можете использовать его таким образом.
const { state, cartItems, setCartitems } = useAppContext();
Комментарии:
1. К сожалению, это не работает. Я действительно пробовал этот метод ранее, но только сейчас повторил, чтобы перепроверить. Я получаю: ReferenceError: menuitems не определен, выполняя проверку деструктурированных элементов в вызове useAppContext(), все они возвращают ‘undefined’ с помощью этого метода.
2. На самом деле, это моя ошибка! Должно быть, у меня просто где-то произошла синтаксическая ошибка, потому что сейчас это работает для меня. На самом деле, именно так я пытался сделать это изначально, но моя ошибка заключалась в том, что у поставщика не было дополнительного набора {} внутри значения= prop.