context/cart.jsx

import { useState, useContext, createContext, useEffect } from "react";

const CartContext = createContext()

const CartProvider = ({ children }) => {
    const [cart,setCart] = useState([])
    const cartTotal = cart.reduce((total, item) => total + item.quantity, 0)
   
    
    useEffect(() => {
        let existingCartItems = localStorage.getItem("cart")
        if(existingCartItems) setCart(JSON.parse(existingCartItems))
    }, [])

    console.log(cartTotal)

    return (
        <CartContext.Provider value={[cart, setCart, cartTotal]}>
            {children}
        </CartContext.Provider>
    )
}

const useCart = () => useContext(CartContext)

export { useCart, CartProvider }

components/Header.jsx

const Header = () => {
    const [auth, setAuth] = useAuth()
    const [cart, cartTotal] = useCart()
    const categories = useCategory()

    console.log(cartTotal)
}

我正在try 将变量cartTotal传递给标题并显示在页面上.虽然上下文可以打印值cartTotal,但当我try 在Header组件上打印输出时,它显示错误function dispatchSetState(fiber, queue, action) { { if (typeof arguments[3] === 'function') { error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().'); } },因此有人可以帮助找出一些解决方案吗?

推荐答案

您不是在记录cartTotal,而是在记录setCart.

Provider中的value中,您传递一个数组,与Object不同,在解构数组时,元素的顺序很重要.cardTotal它是数组中的第三个元素,所以应该是这样得到的:

components/Header.jsx

const [cart, setCart, cartTotal] = useCart();

您也可以只将数组更改为对象:

context/cart.jsx

<CartContext.Provider value={{ cart, setCart, cartTotal }}>
  {children}
</CartContext.Provider>

components/Header.jsx

const { cart, cartTotal } = useCart();

Reactjs相关问答推荐

Reaction路由的问题-在Effect使用API调用响应设置状态之前呈现页面

TypeError:b不是React.js中的函数错误

下拉Tailwind CSS菜单与怪异beviour

XChaCha20-Poly1305的解密函数

TanStack/Reaction-Query在我的Vercel应用程序中不起作用

在新屏幕上显示照片时出现问题-react

在transformResponse中使用来自其他查询的缓存

如何使我的代码可以接受我想要的每一个链接

定位数组中的一项(React、useState)

React 错误: 只能用作 元素的子元素,从不直接渲染.请将您的 包裹在

有没有办法在 React Router v6 中的路由匹配上运行一些逻辑/功能?

无法使用 Suspense 和 Await 获取数据

如何将 npm 包添加到我的 Vite + React 应用程序中?

React-router-dom的链接不改变路由(ReactRouter6)

如何在next.js 13中仅在主页导航栏上隐藏组件?

无法访问 usefocusEffect 中 const 的更新状态

有没有办法在用户离开页面时防止输入模糊?

DatePicker MUI 如何在日历左侧显示清除文本

从其他组件切换 FieldSet

单击当前子div时如何更改p标签的图像和样式?react