反应:即使我返回,渲染也没有返回任何内容

时间:2020-07-08 19:46:53

标签: javascript reactjs

我正在创建嵌套组件以呈现我拥有的数据。

export const MyComponent = (props) => {

  const groupMilestoneByYear = (data) => {
    // Input: Milestone Data (arr[obj])
    // Output: Milestone Data grouped by Year (bj[arr])
    // Group by Year
    let yearGroup = { '2020': [], '2021': [], '2022': [] } // make it dynamic
    data.forEach(element => {
      let currYear = element.event_date.slice(0, 4)
      yearGroup[currYear].push(element)
    });
    return yearGroup
  }

  const renderTimelineContent = (data) => {
    return (
      data.forEach(milestone => {
        let year = milestone.event_date.slice(0, 4)
        let month = milestone.event_date.slice(5, 7)
        let day = milestone.event_date.slice(8, 10)
        return (
          <Content>
            <ContentYear
              startMonth={month}
              monthType="text"
              startDay={day}
              startYear={year}
              useYear={false}
            />
            <ContentBody title={milestone.text}>
            </ContentBody>
          </Content>
        )
      })
    )
  }

  const formMilestoneTimeline = (milestones) => {
    let yearGroup = groupMilestoneByYear(milestones)
    return (
      Object.keys(yearGroup).forEach(year => {
        // for each year, render the timeline
        return (
          <Fragment>
            <h3>{year}</h3>
            <Timeline>
              {renderTimelineContent(yearGroup[year])}
            </Timeline>
          </Fragment>
        )
      })
    )
  }

  return (
    formMilestoneTimeline(milestones)
  );
}

如您所见,我正在使用在循环中返回多个组件的函数。但这给了我一个错误,提示Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.我并没有完全理解该错误,因为我试图返回所有必要的地方。

2 个答案:

答案 0 :(得分:1)

  const formMilestoneTimeline = (milestones) => {
    let yearGroup = groupMilestoneByYear(milestones)
    return (
      Object.keys(yearGroup).forEach(year => {
        // for each year, render the timeline
        return (
          <Fragment>
            <h3>{year}</h3>
            <Timeline>
              {renderTimelineContent(yearGroup[year])}
            </Timeline>
          </Fragment>
        )
      })
    )
  }

以上代码未返回任何内容。对于docsforEach方法的返回值为undefined。如果您想拿东西并将每个项目映射到一个不同的值(即可以渲染的东西),请使用map

  const formMilestoneTimeline = (milestones) => {
    let yearGroup = groupMilestoneByYear(milestones)
    return (
      Object.keys(yearGroup).map(year => {
        // for each year, render the timeline
        return (
          <Fragment>
            <h3>{year}</h3>
            <Timeline>
              {renderTimelineContent(yearGroup[year])}
            </Timeline>
          </Fragment>
        )
      })
    )
  }

答案 1 :(得分:0)

尝试一下,希望它能起作用

export const MyComponent = (props) => {

  const groupMilestoneByYear = (data) => {
    // Input: Milestone Data (arr[obj])
    // Output: Milestone Data grouped by Year (bj[arr])
    // Group by Year
    let yearGroup = { '2020': [], '2021': [], '2022': [] } // make it dynamic
    data.forEach(element => {
      let currYear = element.event_date.slice(0, 4)
      yearGroup[currYear].push(element)
    });
    return yearGroup
  }

  const renderTimelineContent = (props) => {
    return (
      props.data.forEach(milestone => {
        let year = milestone.event_date.slice(0, 4)
        let month = milestone.event_date.slice(5, 7)
        let day = milestone.event_date.slice(8, 10)
        return (
          <Content>
            <ContentYear
              startMonth={month}
              monthType="text"
              startDay={day}
              startYear={year}
              useYear={false}
            />
            <ContentBody title={milestone.text}>
            </ContentBody>
          </Content>
        )
      })
    )
  }

  const formMilestoneTimeline = (props) => {
    let yearGroup = groupMilestoneByYear(props.milestones)
    return (
      Object.keys(yearGroup).forEach(year => {
        // for each year, render the timeline
        return (
          <Fragment>
            <h3>{year}</h3>
            <Timeline>
              <renderTimelineContent yearGroup={yearGroup[year]} />
            </Timeline>
          </Fragment>
        )
      })
    )
  }

  return (
    <formMilestoneTimeline milestones={milestones} />
  );
}