You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Context Hooks如何获取所有菜单数组而非仅首个索引

解决React Native Context Hooks状态管理中无法获取所有菜单数据的问题

问题说明

当前状态管理中仅能访问restaurantMenu数组第一个索引的菜单数据,根源是初始状态仅赋值了第一个分类的菜单:products: restaurantMenu[0].menu,以下是具体修正方案:


步骤1:修复数据代码语法错误

你的restaurantMenu数组存在结构错误,第一个分类对象缺失闭合},先修正:

export const restaurantMenu = [
  {
    id: 1,
    name: "Western",
    foodType:'Western Food',
    rating: 4.8,
    categories: [1],
    icon: icons.western,
    photo: images.background_1,
    price: 20.00,
    menu:[
      {
        id: 1,
        name: "Chicken Fajita",
        photo: images.Chicken_Fajita,
        description: "Grilled Chicken Breast, Onion, Bell Pepper, Fajita Sauce",
        price: 20.00,
        rating:3,
        reviews:89,
      },
      {
        id: 2,
        name: "Cordon Bleu",
        photo: images.Cordon_Bleu,
        description: "Panne Fried Chicken Breast Stuffed with Mozzarella Cheese, Mushroom",
        price: 21.00,
        rating:4,
        reviews:90,
      },
    ]
  }, // 补上缺失的闭合大括号
  {
    id: 2,
    name: "Burgers",
    rating: 4.5,
    categories: [2],
    icon: icons.burger,
    photo: images.background_2,
    price: 10.00,
    menu:[
      {
        id: 3,
        name: "Beef Burger",
        photo: images.Beef_Burger,
        description: "Fresh Beef Patty, Lettuce, Mayonnaise Topped with Cheddar Cheese",
        price: 15.00,
        rating:3,
        reviews:89,
      },
      {
        id: 4,
        name: "Chicken Burger",
        photo: images.Chicken_Burger,
        description: "Fresh Chicken Burger Patty, Lettuce, Garlic Sauce, Cocktail Sauce,",
        price: 15.00,
        rating:3,
        reviews:89,
      },
    ]       
  }
];

步骤2:修改初始状态,合并所有菜单数据

将initialState中的products改为合并所有分类的菜单数组:

const initialState = {
  // 用flatMap合并所有分类的menu数组
  products: restaurantMenu.flatMap(item => item.menu),
  cart: [],
};

若环境不支持flatMap,可替换为reduce写法:

products: restaurantMenu.reduce((acc, item) => [...acc, ...item.menu], []),

步骤3:修正Reducer中的拼写错误

Reducer内INCREASE和DECREASE操作存在action.payLoad的大小写错误(应为action.payload),修正后:

const reducer = (state = initialState, action)=>{
    switch(action.type){
        // 保留原有ADD、DELETE、CLEAR逻辑不变
        case 'ADD':
            const item = state.products.find(
                (product) => product.id === action.payload.id
              );
              const inCart = state.cart.find((item) =>
                item.id === action.payload.id ? true : false
              );
        
              return {
                ...state,
                cart: inCart
                  ? state.cart.map((item) =>
                      item.id === action.payload.id
                        ? { ...item, qty: item.qty + 1 }
                        : item
                    )
                  : [...state.cart, { ...item, qty: 1 }],
              };
            
        case 'DELETE':
        return {
            ...state,
            cart: state.cart.filter((item) => item.id !== action.payload.id),
          };
       
        case 'INCREASE':
               const tempCart = state.cart.map((cartItem) => {
                // 修正为action.payload
                if (cartItem.id === action.payload.id) {
                  return { ...cartItem, qty: cartItem.qty + 1 };
                }
                return cartItem;
              });
              return { ...state, cart: tempCart };
        
        case 'DECREASE':
                const temp = state.cart.map((cartItem) => {
                    // 修正为action.payload
                    if (cartItem.id === action.payload.id) {
                      return { ...cartItem, qty: cartItem.qty - 1 };
                    }
                 return cartItem;
                  })
                  .filter((cartItem) => cartItem.qty !== 0);
                return { ...state, cart: temp };
              
        case 'CLEAR':
              return {cart :[]}
           
        default:
            throw new Error(`unknow action.${action.type}`)
    }
}

验证效果

修改完成后,state.products将包含所有分类的菜单数据,购物车的增删改查逻辑也能正常匹配所有商品ID。

内容的提问来源于stack exchange,提问作者Bashamlan Salem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:15:32