使用上下文 API 时出现此错误。 TypeError: Object is not iterable (cannot read property Symbol(Symbol.iterator))

Posted

技术标签:

【中文标题】使用上下文 API 时出现此错误。 TypeError: Object is not iterable (cannot read property Symbol(Symbol.iterator))【英文标题】:Getting this error while using context API. TypeError: Object is not iterable (cannot read property Symbol(Symbol.iterator)) 【发布时间】:2021-01-31 17:22:00 【问题描述】:

我刚刚尝试使用上下文 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))

请解决这个问题。提前致谢

【问题讨论】:

【参考方案1】:

Context API 没有任何问题,您只需将组件包装在其中即可。

下面是我的解决方案

       <CartValue>
            <ChildContext />
       </CartValue>

【讨论】:

【参考方案2】:

您将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>  
    )

【讨论】:

那么我如何在没有方法的情况下更新 cartState 值? @manee 您目前没有在CartValue 组件中更新它,因此您不需要那里的方法。当您将带有值和更新器函数的整个数组传递到上下文时,您仍然可以在使用上下文的地方更新它。 除了空白屏幕外,我没有得到任何输出 它返回一个未定义的值。我已经通过 console.log() 进行了检查 @manee 你如何渲染你的组件?您是否知道您需要将ChildContext 包装成CardValue 才能使其工作?有关工作示例,请参阅此:codesandbox.io/s/ecstatic-shannon-nor48?file=/src/App.js【参考方案3】:

变化:

const [cart,setCart]=useContext(CartContext)

const cart = useContext(CartContext)

原因是,您在CartContext.Provider value=cart 中提供的值是一个数字,而不是一个数组。

【讨论】:

我在教程中看到过这个并尝试过。他说我们可以通过这个上下文 api 发送整个状态 检查this

以上是关于使用上下文 API 时出现此错误。 TypeError: Object is not iterable (cannot read property Symbol(Symbol.iterator))的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试将firebase添加到flutter时出现此错误“已弃用的API”

为啥在尝试从 api 获取数据时出现此错误“TypeError:字符串索引必须是整数”?

尝试从反应应用程序连接到 graphcool 中继 API 时出现此错误:模块构建失败:错误:没有有效的 GraphQL 端点

尝试使用匕首刀柄的代码时出现此错误,错误:[Hilt] java.lang.reflect.InvocationTargetException(无错误消息)

为啥在尝试将 UIPopover 附加到不同类中的 UIButton 时出现此构建错误?

为啥调用 API 时出现 CORS 错误