我正在寻找一个解决方案,如何正确地持有产品添加到购物车在会议中.目前我是这样解决的:

Page.tsx

const ProductPage = () => {
  const { product, loading, error } = useProductData();
  const { cart, addToCart: addToCartHook } = useCartItems(); // Use the addToCart function from the hook

  const [isCartOpen, setIsCartOpen] = useState(false);

  // Assuming there is an interface for your product/item
interface ProductItem {
  databaseId: number;
  // Other properties...
}

const handleAddToCart = (item: ProductItem) => {
  // Use the addToCart function from the hook
  addToCartHook(item);

  // Add item to WooCommerce cart using GraphQL mutation
  addToCart(item.databaseId, 1); // Assuming quantity is 1, adjust as needed
};

  useEffect(() => {
    // Open the cart when the cart is updated
    if (cart.length > 0) {
      setIsCartOpen(true);
    }
  }, [cart]);

  const handleCloseCart = () => {
    setIsCartOpen(false);
  };

  return (

以下是Hook useCartItems:

export const useCartItems = () => {
  
  // Load cart from localStorage on hook initialization
  const initialCart = JSON.parse(localStorage.getItem('cart')) || [];
  const [cart, setCart] = useState(initialCart);

  // Save cart to localStorage whenever it changes
  useEffect(() => {
    localStorage.setItem('cart', JSON.stringify(cart));
  }, [cart]);

  // Function to add an item to the cart
  const addToCart = (item) => {
    setCart([...cart, item]);
  };

  // Function to clear the entire cart
  const clearCart = () => {
    setCart([]);
  };

  // Function to remove a specific item from the cart
  const removeFromCart = (itemId) => {
    const updatedCart = cart.filter((item) => item.id !== itemId);
    setCart(updatedCart);
  };

  // Calculate cart count
  const cartCount = cart.length;

  return {
    cart,
    cartCount,
    addToCart,
    clearCart,
    removeFromCart,
  };
};

这个钩子工作并检索购物车中的物品,但问题出在这部分功能上: Const InitialCart=JSON.parse(localStorage.getItem(‘cart’))||[];

此工作但Nextjs每次都返回错误:

ReferenceError: localStorage is not defined
    at useCartItems (./lib/woocommerce/index.ts:454:36)
    at Navbar (./components/layout/navbar/index.tsx:43:96)
  459 |
  460 |   // Load cart from localStorage on hook initialization
> 461 |   const initialCart = JSON.parse(localStorage.getItem('cart')) || [];

我不确定我是否应该这样写,或者也许有其他的解决方案.

推荐答案

您使用的是Pages Route,它首先在服务器端呈现页面,而本地存储在服务器端不可访问,因此出现错误.你必须使它有条件,例如使用useEffect或其他技术,所以它只在客户端运行时运行.因此,您可以通过这种方式修改挂钩以获得所需的功能:

Solution one: 使用额外的useEffect

export const useCartItems = () => {

// Load cart from localStorage on hook initialization
   const [cart, setCart] = useState([]);

   useEffect(() => {
    setCart(JSON.parse(localStorage.getItem('cart')))
  }, []);

 // Save cart to localStorage whenever it changes
 useEffect(() => {
  localStorage.setItem('cart', JSON.stringify(cart));
  }, [cart]);

// Function to add an item to the cart
   const addToCart = (item) => {
   setCart([...cart, item]);
 };

 // Function to clear the entire cart
 const clearCart = () => {
   setCart([]);
  };

 // Function to remove a specific item from the cart
 const removeFromCart = (itemId) => {
   const updatedCart = cart.filter((item) => item.id !== itemId);
   setCart(updatedCart);
 };

 // Calculate cart count
 const cartCount = cart.length;

  return {
   cart,
   cartCount,
   addToCart,
   clearCart,
   removeFromCart,
   };
  };

Solution two:使用相同的useEffect,但在第一次渲染时设置

export const useCartItems = () => {

// Load cart from localStorage on hook initialization
   const [cart, setCart] = useState([]);
   const firstRender=useRef(true)


 // Save cart to localStorage whenever it changes
 useEffect(() => {
 if(firstRender.current){
    setCart(JSON.parse(localStorage.getItem('cart')))
    fristRender.current=false;
  }else{
  localStorage.setItem('cart', JSON.stringify(cart));}
  }, [cart]);

// Function to add an item to the cart
   const addToCart = (item) => {
   setCart([...cart, item]);
 };

 // Function to clear the entire cart
 const clearCart = () => {
   setCart([]);
  };

 // Function to remove a specific item from the cart
 const removeFromCart = (itemId) => {
   const updatedCart = cart.filter((item) => item.id !== itemId);
   setCart(updatedCart);
 };

 // Calculate cart count
 const cartCount = cart.length;

  return {
   cart,
   cartCount,
   addToCart,
   clearCart,
   removeFromCart,
   };
  };

Reactjs相关问答推荐

InfiniteScroll持续获取数据,直到超过最大更新深度

从`redux—thunk`导入thunk `在stackblitz中不起作用

无法在列表中看到文本

后端关闭时如何在REACTION AXIOS拦截器中模拟数据?

使用筛选器的Primereact DataTable服务器端分页?

禁止直接访问Next.js中的页面,同时允许从应用程序内部访问

在动态React组件中删除事件侦听器

GitHub页面未正确显示Reaction应用程序网站

useRef()的钩子调用无效

useEffect不重新渲染

React设置上下文并进行导航

当我使用 Firebase Auth 在 React 中刷新主页时显示登录页面

为什么 setState 在 React 中不是异步的?

使用 axios 响应路由 Dom 操作

如何在 nextjs 中单击按钮时动态导入和渲染组件?

如果传递给挂钩的数据需要事先修改,如何使用自定义挂钩?

使用 react-router-dom 时弹出空白页面

setState 改变对象引用

当我在其中传递 2 个箭头函数时,为什么我的 onClick 事件不适用于 useState

React 检测哪些 props 在 useEffect 触发器上发生了变化