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

React Router Dom v6:重定向前执行函数时sessionStorage未设置问题

问题原因与解决方案

核心原因

React的setState是异步操作,navigate会立即触发页面跳转,导致当前组件被卸载——此时监听productsCartNew的useEffect还没来得及执行,自然无法把更新后的状态写入sessionStorage。

而addToCart里的alert会阻塞JS线程,给了React足够时间完成状态更新并触发useEffect,所以能正常写入sessionStorage。

解决方案

方案1:在setState回调中处理存储与跳转

利用setState的回调(状态更新完成后执行),先手动写入sessionStorage,再执行跳转:

function handleCheckout(id) {
  setProductsCartNew((prevProductsCart) => {
    const newCart = [...prevProductsCart, id];
    sessionStorage.setItem("cart", JSON.stringify(newCart));
    return newCart;
  });
  navigate("/checkout");
}

方案2:通过状态标记在useEffect中触发跳转

新增状态标记是否需要跳转结账,在useEffect中统一处理存储和跳转逻辑:

const [shouldNavigateToCheckout, setShouldNavigateToCheckout] = useState(false);

function handleCheckout(id) {
  setProductsCartNew((prevProductsCart) => [...prevProductsCart, id]);
  setShouldNavigateToCheckout(true);
}

useEffect(() => {
  sessionStorage.setItem("cart", JSON.stringify(productsCartNew));
  if (shouldNavigateToCheckout) {
    navigate("/checkout");
    setShouldNavigateToCheckout(false);
  }
}, [productsCartNew, shouldNavigateToCheckout, navigate]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:32:39