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

Vercel部署后localStorage中cart对象存为字符串致购物车异常

问题:Vercel部署后localStorage中cart被存为字符串"cart"导致购物车无法显示

在Vercel部署网站后,发现localStorage里的cart本应是对象,却被存储为字符串"cart",导致购物车无法正常显示。购物车对象在addToCart方法中创建,初始为空对象,添加商品时以商品编码为键,存储qty、price、name、size、variant等属性。

相关代码片段:

if (itemCode in cart) {
  newCart[itemCode].qty = cart[itemCode].qty + qty
}
else {
  newCart[itemCode] = { qty: 1, price, name, size, variant }
}

完整代码:

const [cart, setCart] = useState({})

const [subTotal, setSubTotal] = useState(0)

useEffect(() => {
  try {
    if (localStorage.getItem("cart")) {
      setCart(JSON.parse(localStorage.getItem("cart")));   
      saveCart(JSON.parse(localStorage.getItem("cart"))); 
    }
  } 
  catch (error) {
    console.error(error);
    localStorage.clear;
  }
}, [])

const saveCart = (myCart) => {
  localStorage.setItem("cart",JSON.stringify(myCart))
  let subt = 0;
  
  let keys = Object.keys(myCart)
  for (let index = 0; index < keys.length; index++) {
    subt += myCart[keys[index]].qty * myCart[keys[index]].price
  }
  setSubTotal(subt)
}

const addToCart = (itemCode, qty, price, name, size, variant) => {
  let newCart = cart;

  if (itemCode in cart) {
    newCart[itemCode].qty = cart[itemCode].qty + qty
  }
  else {
    newCart[itemCode] = { qty: 1, price, name, size, variant }
  }

  setCart(newCart);
  saveCart(newCart);
}

问题截图:
cart在localStorage中为字符串


修复方案

1. 修复状态更新的引用问题

在addToCart中直接引用原cart对象,会导致React无法检测到状态变化,进而引发存储异常。需要创建原对象的浅拷贝:

const addToCart = (itemCode, qty, price, name, size, variant) => {
  // 浅拷贝原cart对象
  let newCart = { ...cart };

  if (itemCode in cart) {
    // 嵌套对象需再次拷贝,避免修改原状态
    newCart[itemCode] = { ...newCart[itemCode], qty: newCart[itemCode].qty + qty };
  } else {
    newCart[itemCode] = { qty: 1, price, name, size, variant };
  }

  setCart(newCart);
  saveCart(newCart);
}

2. 修正localStorage清除方法调用

catch块中localStorage.clear缺少括号,无法执行清除操作,需改为:

catch (error) {
  console.error(error);
  localStorage.clear();
}

3. 简化初始化逻辑

避免重复解析localStorage,优化useEffect内的代码:

useEffect(() => {
  try {
    const savedCart = localStorage.getItem("cart");
    if (savedCart) {
      const parsedCart = JSON.parse(savedCart);
      setCart(parsedCart);
      saveCart(parsedCart);
    }
  } catch (error) {
    console.error(error);
    localStorage.clear();
    setCart({});
    setSubTotal(0);
  }
}, [])

完成以上修改后,即可解决cart被错误存储为字符串的问题,恢复购物车正常功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:31:06