代码之家  ›  专栏  ›  技术社区  ›  Dom

useEffect在React中第一次装载时返回空数组

  •  1
  • Dom  · 技术社区  · 2 年前

    context/cart.jsx

    import { useState, useContext, createContext, useEffect } from "react";
    
    const CartContext = createContext()
    
    const CartProvider = ({ children }) => {
        const [cart, setCart] = useState([])
        const existingCartItems = localStorage.getItem("cart");
        console.log(existingCartItems)
    
        useEffect(() => {
            setCart(JSON.parse(existingCartItems));
        }, [existingCartItems])
    
        console.log(cart)
    
        return (
            <CartContext.Provider value={[cart, setCart]}>
                {children}
            </CartContext.Provider>
        )
    }
    
    const useCart = () => useContext(CartContext)
    
    export { useCart, CartProvider }
    

    pages/CartPage.jsx

    const CartPage = () => {
        const [cart, setCart] = useCart() <-- The value returning an empty array on first mount
    }
    

    我试图用本地存储值而不是空数组来装载cart的值。是什么原因 cart 在其他组件页上返回一个空数组,即使我已经使用过 useEffect 以设置该值。如何拥有 运货马车 返回本地存储中的值,而不是在第一次装载时返回空数组?

    3 回复  |  直到 2 年前
        1
  •  1
  •   Isha Padalia    2 年前

    当您的组件装载时,您的购物车的初始状态似乎遇到了问题。您在第一次装载时看到空数组的原因是操作序列以及useState和useEffect的异步性质。

    1. 您初始化 运货马车 使用空数组 useState

    2. CartPage组件挂载,此时cart仍然是一个空数组,因为 使用效果 尚未运行。

    3. 使用效果 在组件装载后运行,但设置状态是异步的。因此,如果您尝试在组件装载后立即访问cart(例如在CartPage中),它仍然是一个空数组。

       const CartProvider = ({ children }) => {
       const existingCartItems = localStorage.getItem("cart");
       const [cart, setCart] = useState(existingCartItems ? JSON.parse(existingCartItems) : []);
      
       useEffect(() => {
           if (existingCartItems) {
               setCart(JSON.parse(existingCartItems));
           }
       }, [existingCartItems])
      
       // ...
      
       return (
           // ...
       )
      

      }

        2
  •  0
  •   Ferhat Altundal    2 年前

    这将确保setCart在带有解析的cart项目的初始装载时被调用,即使existingCartItems最初为null或未定义。如果existingCartItems为null,它将跳过setCart调用,因为If(parsedCart)检查将失败。通过这种方式,可以防止在初始装载时使用空数组调用setCart。

    试试这个:

    useEffect(() => {
    const parsedCart = JSON.parse(existingCartItems);
    if (parsedCart) {
        setCart(parsedCart);
    } }, []);
    
        3
  •  0
  •   Anjali Kalsariya    2 年前

    更改本地存储时不会调用UseEffect。所以这就是为什么得到一个空数组。