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

React useContext数据传递异常:购物车页面items数组为空

问题分析与解决方案

你的核心问题是:使用useContext实现购物车时,添加商品能打印正确数据,但跳转到购物车页面后items数组始终为空。主要原因是状态更新时的闭包问题,以及可能存在的页面刷新导致状态丢失的情况,以下是具体修复步骤:


1. 修复购物车状态更新逻辑

原addToCart函数直接依赖cartItems变量,会因闭包问题获取到旧的状态值,导致状态更新不生效。改为函数式更新,确保每次都获取最新的购物车状态:

修改CartContext.jsx中的addToCart和removeFromCart函数:

import React, { createContext, useState } from 'react';

export const CartContext = createContext();

export const CartProvider = ({ children }) => {
  const [cartItems, setCartItems] = useState([]);

  // 使用函数式更新获取最新状态
  const addToCart = (item) => {
    setCartItems(prevCartItems => [...prevCartItems, item]);
  };

  const removeFromCart = (itemId) => {
    setCartItems(prevCartItems => prevCartItems.filter((item) => item.id !== itemId));
  };

  const cart = {
    items: cartItems,
    addToCart,
    removeFromCart,
  };

  return (
    <CartContext.Provider value={cart}>
      {children}
    </CartContext.Provider>
  );
};

2. 确保单页导航避免状态丢失

如果添加商品后是手动刷新页面跳转,React内存中的状态会被清空。在Produit-card.tsx的sendToCart函数中添加单页导航代码,确保状态不会丢失:

const sendToCart = (id: number) => {
  const item = {
    id: produit.id,
    name: produit.name,
    price: produit.prix,
    quantity: valeure,
  };
  console.log(item);
  cart.addToCart(item);
  navigate('/panier'); // 添加单页导航,避免刷新页面
};

3. 验证Context导入路径一致性

确保Panier.tsx和Produit-card.tsx中导入CartContext的路径正确,避免因路径错误导致使用不同的Context实例:

  • Panier.tsx:import { CartContext } from '../components/CartContext';
  • Produit-card.tsx:import { CartContext } from './CartContext';

当前路径符合目录结构(Produit-card.tsx在components目录,Panier.tsx在pages目录),无需修改。


完成以上修改后,点击添加商品按钮,会自动跳转到购物车页面,此时items数组会正确显示已添加的商品,即可正常遍历渲染购物车列表。

内容的提问来源于stack exchange,提问作者vahatriniaina ramaheninarivo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:05:28