【问题标题】:TypeError: Cannot read property 'map' of undefined...even though property is defined?TypeError:无法读取未定义的属性“映射”......即使属性已定义?
【发布时间】:2021-08-05 14:24:58
【问题描述】:

我一直在关注 Max Schwarzmueller 关于 Udemy 的 React 课程,到目前为止一切进展顺利。在听他讲课的过程中,我遇到了一个我一辈子都无法解决的错误。

有问题的项目是一个费用跟踪器,错误本身与一个图表有关,该图表衡量给定月份对当年费用的贡献程度。 dataPoints 属性从 ExpensesChart(父组件)传递到 Chart(子组件),用于依次渲染每个 ChartBars(Chart 的子组件)。然后使用 map() 将每个点的值分配给一个数组,以便可以使用 Math.max() 找到最大值,但由于某种原因,尝试加载站点会引发错误:

TypeError:无法读取未定义的属性“地图”
5 | const dataPointValues = props.dataPoints.map(dataPoint => dataPoint.value);

这是所有三个的代码:

ExpensesChart.js:

import Chart from "../Chart/Chart";

function ExpensesChart(props) {
  const chartDataPoints = [
    { label: "Jan", value: 0 },
    { label: "Feb", value: 0 },
    { label: "Mar", value: 0 },
    { label: "Apr", value: 0 },
    { label: "May", value: 0 },
    { label: "Jun", value: 0 },
    { label: "Jul", value: 0 },
    { label: "Aug", value: 0 },
    { label: "Sep", value: 0 },
    { label: "Oct", value: 0 },
    { label: "Nov", value: 0 },
    { label: "Dec", value: 0 },
  ];

  for (const expense of props.expenses) {
    const expenseMonth = expense.date.getMonth(); // 0-indexed
    chartDataPoints[expenseMonth].value += expense.amount;
  }

  return <Chart dataPoints={chartDataPoints} />;
}

export default ExpensesChart;

Chart.js:

import ChartBar from "./ChartBar";
import "./Chart.css";

function Chart(props) {
  const dataPointValues = props.dataPoints.map(dataPoint => dataPoint.value);
  const totalMaximum = Math.max(...dataPointValues);

  return (
    <div className="chart">
      {props.dataPoints.map((dataPoint) => (
        <ChartBar
          key={dataPoint.label}
          value={dataPoint.value}
          maxValue={totalMaximum}
          label={dataPoint.label}
        />
      ))}
    </div>
  );
}

export default Chart;

ChartBar.js:

import "./ChartBar.css";

function ChartBar(props) {
  let barFillHeight = "0%";

  if (props.maxValue > 0) {
    barFillHeight = Math.round((props.value / props.maxValue) * 100) + "%";
  }

  return (
    <div className="chart-bar">
      <div className="chart-bar__inner">
        <div
          className="chart-bar__fill"
          style={{ height: barFillHeight }}
        ></div>
      </div>
      <div className="chart-bar__label">{props.label}</div>
    </div>
  );
}

export default ChartBar;

我几乎可以肯定 chartDataPoints(通过它的 props 传递给 Chart 的值)存在,所以我不知道出了什么问题。该站点上的其他一些答案以及其他一些与异步加载组件有关的答案,但我不确定这是否适用于这里,因为其中一些帖子使用了 AJAX。

任何帮助将不胜感激!

编辑:我遇到了更奇怪的行为。我想我可以尝试通过 Chrome 的 DevTools 进行调试,但经过检查,在 Sources 选项卡下的文件树中找不到 ExpensesChart。这是一张图片:

此外,任何放置在 ExpensesChart 文件中任何位置的 console.log() 语句(在函数的开头或结尾,甚至在函数之外)都不会在控制台中注册。发生这种情况是因为错误吗?

我尝试明确指定 dataPointValues 的数据类型,但这仍然无法完全正常工作。完成后页面实际加载,但图表显示不正确。代码现在如下所示:

import ChartBar from "./ChartBar";
import "./Chart.css";

Chart.defaultProps = {
  dataPoints: []
}

function Chart(props) {
  const dataPointValues = props.dataPoints.map(dataPoint => dataPoint.value);
  const totalMaximum = Math.max(...dataPointValues);

  return (
    <div className="chart">
      {props.dataPoints.map((dataPoint) => (
        <ChartBar
          key={dataPoint.label}
          value={dataPoint.value}
          maxValue={totalMaximum}
          label={dataPoint.label}
        />
      ))}
    </div>
  );
}

export default Chart;

它看起来像这样:

...也就是说,空白。

【问题讨论】:

  • 显然值 is 未定义,因此 undefined.map(..) 导致异常。从那开始,然后向后工作以找出为什么它是undefined
  • 我试过你的代码,除了ExpensesChart中的props.expenses之外,它工作正常。所以这可能是一个开始寻找的好地方。
  • @jaggerabney,我无法复制错误消息。我在您的问题中创建了文件,并将问题中的代码复制到其中。然后我创建了一个包含 9 个对象元素的费用数组。每个元素都有一个使用 JavaScript date 函数生成的 date 属性和一个使用 JavaScript Math.random 函数生成的 amount 属性。尝试重新启动开发服务器,即终端中的 Ctrl + C,然后运行 ​​npm start 命令。
  • @ShamarYarde 啊,要是这么简单就好了……我试过了,但没有运气。

标签: javascript reactjs


【解决方案1】:

检查您的props.dataPoints 是否为undefined

替换这一行:

const dataPointValues = props.dataPoints.map(dataPoint => dataPoint.value);

用这个:

const dataPointValues = props.dataPoints && props.dataPoints.map(dataPoint => dataPoint.value);

【讨论】:

  • 这是一个解决方案,但我认为 OP 想知道是什么导致 props.dataPoints 在静态传递时首先未定义。
  • 我不认为这是一个解决方案。 dataPoints 显然已定义,他应该能够读取道具。肯定还有别的东西
  • 添加这个只会改变我得到的错误消息“TypeError:dataPointValues is not iterable (cannot read property undefined)”。
【解决方案2】:

天哪。我想通了。

在 Expenses.js(我没有包含的一个文件,它是 ExpensesChart 的父文件)中,我写了以下行:

import ExpensesChart from "../Chart/Chart";

我改成:

import ExpensesChart from "../Expenses/ExpensesChart";

...而且效果很好。叹息……

【讨论】:

    【解决方案3】:

    在我的例子中,我将文件 ExpensesChart.js 从 dataPoint={chartDataPoints} 更改为 dataPoints={chartDataPoints} 并且它有效。

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 2021-06-20
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多