【问题标题】:Error: Trying to print out array elements in React Function Component?错误:试图在 React 函数组件中打印出数组元素?
【发布时间】:2020-04-13 11:49:55
【问题描述】:

尝试记录数组元素,我收到以下错误:

TypeError: 无法读取未定义的属性“0”

但是,当我可以在控制台中记录 project.tasks 数组对象时。但它无法记录元素。

数组似乎存在,因为我可以记录对象但不能记录元素。我很困惑。想法?

代码沙盒:https://codesandbox.io/s/blissful-mclaren-ll5wo

function EditProjectView(props) {
  const [project, setProject] = useState({});

  // get id from params
  const { id } = useParams();

  // syncronously (same time before and then after) renders it will use this hook
  useLayoutEffect(() => {
    // fake* ajax request to database
    const data = database.projects.find((project) => {
      return project.id == 123;
    }, []);

    setProject(data);
  });

  if (project) {
    return (
      <React.Fragment>
        <main style={classes.content}>
          <div style={classes.projectContainer}>
            <div style={classes.projectOverviewWrapper}>
              <Paper elevation={2}>
                <div style={classes.project}>
                  {/* {<ProjectDetailsView project={project} />} */}
                </div>
              </Paper>
            </div>
            <div style={classes.tasksContainer}>
              <h3>ALL TASKS</h3>
              {console.log(
                "prints out array object successfully i.e. [{..}, {..]]  <-------------",
                project.tasks
              )}
              {console.log(
                "does NOT print array object's elements FAIL <-----------",
                project.tasks[0].taskName
              )}
              <TaskExpansionPanel
                panelTitle={
                  <PanelTitle
                  // totalTimeInMinutes={task.totalTimeInMinutes}
                  // taskNumber={task.taskNumber}
                  // taskName={task.taskName}
                  // taskName={project.projectName}
                  />
                }
                panelDetails={<PanelDescription />}
              />
              <CreateTaskBtn />
            </div>
          </div>
        </main>
      </React.Fragment>
    );
  } else {
    return <p>loading..</p>;
  }
}

【问题讨论】:

  • 你能用代码创建一个codesandbox吗?
  • 为什么要在 return 中添加 console.log 语句?在返回之前添加它们并检查首先记录的内容。

标签: javascript arrays reactjs react-redux


【解决方案1】:

试试这个

function printTasks(tasks) {
  if (tasks && tasks.length > 0) {
      return ( console.log(tasks[0].taskName));
  } else {
      return "No tasks found";
  }
}

然后在你的组件中调用它来代替你当前的检查。

{printTasks(project.tasks)}

我认为这里发生的情况是,您从数据库中获取的数据没有完成,因为第一次绘制组件,所以它失败了。通过此检查,当获取数据时,它将实时看到第二次更新。

【讨论】:

  • 成功了!但是我看不到 if(project) 在 if(project.tasks && project.tasks.length > 0) 渲染时如何失败? ...如果一个项目存在,那么它的任务属性也应该如此吗?请解释,
  • 如果数组为空或不存在,project.tasks 将为 false。甚至 project.tasks.length 也可能是多余的
  • 这是有道理的。然而,project.tasks 的长度总是 >0 我只是 database.js(假数据)..你可以在这里查看 database.js 文件:codesandbox.io/s/blissful-mclaren-ll5wo ?
  • 是的,但是在组件第一次挂载时可能无法获取?
  • 有趣。所以这意味着当数据开始从 fetch 进来时反应渲染......而不是等待响应完成?要去研究这个。你确定吗?
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多