开发者问题收集

react js undefined 不可迭代(无法读取属性 Symbol(Symbol.iterator))错误

2022-08-11
3865

因此,我正在尝试使用 React 制作一个待办事项应用程序,我刚刚尝试使用 Context,但一直收到未定义不可迭代:

这是 Main/index.js:

import React,{useContext} from "react";
import { BrowserRouter as Router,Routes, Route, Link} from 'react-router-dom';
import {GlobalContext} from "../Context/provider.js"
import TodoForm from "../Todo-Form/index.js"
import Description from "../Description/index.js"
import "./style.css";

export default function Main () {

const {todos, setTodos} = useContext(GlobalContext);

const addTodo = text => {
    const newTodos = [...todos, { text }];
    setTodos(newTodos);
};

const completeTodo = index => {
    const newTodos = [...todos];
    newTodos[index].isCompleted = newTodos[index].isCompleted ? false : true;
    setTodos(newTodos);
};

这是 Context/provider.js:

import React from "react";
   import { useState,createContext } from "react";

   export const GlobalContext = createContext()

  export  const ContextProvider = ({children})=> {
    const [todos, setTodos] = useState([
        {
          text: "You can write your to-do above and add",
          isCompleted: false,
          description: "hello",
          id:0
        },
    ]);
    return(
       <GlobalContext.Provider value = {{todos, setTodos}} >
            {children}
       </GlobalContext.Provider>
    )
}

编辑已解决!! 除了我的问题: const {todos, setTodos} = useContext(GlobalContext); 事实证明,我没有使用提供程序包装,因此当我在 app.js 中执行此操作时,它有效:

<ContextProvider>
  <div className="main-div">
    <Header />
    <Main />
  </div>

</ContextProvider>

感谢所有查看并提供一些解决方案的人。

2个回答

问题可能出在这里: const [todos, setTodos] = useContext({GlobalContext});

尝试输入 const [todos, setTodos] = useContext(GlobalContext); (删除 GlobalContext 周围的括号),因为您传递的是带有 {GlobalContext: GlobalContext} 的对象,而不是仅将上下文作为参数传递。

除此之外,我还发现其他几个问题:

  1. 最主要的是您需要用在 provider.js 中定义的内容包装 <Main /> 。然后,您可以将组件放入可以访问上下文的 ContextProvider 中。
  2. 修复 ContextProvider 中 children prop 中的拼写错误 这是一个沙盒: https://codesandbox.io/s/shy-meadow-8gf0sd?file=/src/App.js
dmc85
2022-08-11

问题是您在数组中插入了一个对象。如果您的全局上下文是一个数组,则应按如下方式设置值:

const [todos, setTodos] = useContext(GlobalContext);

之后,您可以遍历待办事项。

除此之外,我还看到了其他几个问题:

  1. 主要是您需要用从 provider.js 导入的内容进行包装。然后,您可以将组件放入可以访问上下文的 ContextProvider 中。
  2. 修复 ContextProvider 中 children prop 中的拼写错误

这是一个沙盒: https://codesandbox.io/s/shy-meadow-8gf0sd?file=/src/App.js

Arman
2022-08-11