我刚刚尝试使用上下文api从另一个组件访问一个变量,但它抛出了奇怪的错误。
这是我的父组件。
import React,{createContext,useState} from 'react'
export const CartContext=createContext()
const CartValue =(props)=>{
const [cart,setCart]=useState(0)
return (
<CartContext.Provider value={[cart,setCart]}>
{props.children}
</CartContext.Provider>
)
}
export default CartValue
下面是我的子组件。
import React,{useContext} from 'react'
import CartValue,{CartContext} from './CartValue'
function ChildContext() {
const [cart,setCart]=useContext(CartContext)
return (
<div>
<h3>{cart}</h3>
</div>
)
}
export default ChildContext
下面是我得到的错误。
TypeError: Object is not iterable (cannot read property Symbol(Symbol.iterator))
请解决这个问题。提前感谢
上下文API没有任何问题,您只需要将组件封装在其中即可。
下面是我的解决方案
<CartValue>
<ChildContext />
</CartValue>
您将cart
作为值传递到CartContext.Provider
,这意味着您的上下文包含cart
的值,该值似乎是默认为0
的数字。但是,当使用上下文时,您将其视为useState
返回的数组。这就是您看到错误Object is not iterable
的原因。这个错误一点也不奇怪。这只是意味着你试图迭代一些不是数组或任何可迭代的东西。
如果你想这样做,你需要把useState
返回的所有内容都放在上下文中,而不仅仅是状态值:
const CartValue =(props)=>{
const cartState = useState(0)
return (
<CartContext.Provider value={cartState}>
{props.children}
</CartContext.Provider>
)
}
更改:
const [cart,setCart]=useContext(CartContext)
至
const cart = useContext(CartContext)
原因是,您在CartContext.Provider value={cart}
中提供的值是一个数字,而不是数组。