React - TypeError:无法读取未定义的属性“map”

时间:2016-11-12 19:46:19

标签: javascript reactjs ecmascript-6 es6-map

我正在使用Recharts库构建图表库。

这些是我正在处理的文件

数据夹具是 charts.js

const charts = [
  {name: 'Page A', uv: 4000, pv: 2400, amt: 2400},
  {name: 'Page B', uv: 3000, pv: 1398, amt: 2210},
  {name: 'Page C', uv: 2000, pv: 9800, amt: 2290},
  {name: 'Page D', uv: 2780, pv: 3908, amt: 2000},
  {name: 'Page E', uv: 1890, pv: 4800, amt: 2181},
  {name: 'Page F', uv: 2390, pv: 3800, amt: 2500},
  {name: 'Page G', uv: 3490, pv: 4300, amt: 2100},
];

export default charts;

数据在我的商店中与其他数据一起正确导入

然后我有 ChartsGrid.js ,其中错误来自

import React from 'react';
import Chart from './Chart';

export default class ChartsGrid extends React.Component{
  render() {
    return (
      <div className="grid">
        {this.props.charts.map((chart, i) => <Chart {...this.props} key={i} i={i} chart={chart} />)}
      </div>
    )
  }
};

这里我的图表组件从recharts库中导入模块

import React from 'react';
import { Link } from 'react-router';
import { ResponsiveContainer, LineChart, Line, XAxis, YAxis, ReferenceLine,
  ReferenceDot, Tooltip, CartesianGrid, Legend, Brush } from 'recharts';

export default class Chart extends React.Component {
  render () {
    const { chart, i} = this.props;
    return (
        <LineChart width={600} height={300} data={charts}
            margin={{top: 5, right: 30, left: 20, bottom: 5}}>
       <XAxis dataKey="name"/>
       <YAxis/>
       <CartesianGrid strokeDasharray="3 3"/>
       <Tooltip/>
       <Legend />
       <Line type="monotone" dataKey="pv" stroke="#8884d8" activeDot={{r: 8}}/>
       <Line type="monotone" dataKey="uv" stroke="#82ca9d" />
      </LineChart>
    );
  }
};

为什么抛出此错误TypeError:无法读取未定义的属性“map”?实际上什么是未定义的?

5 个答案:

答案 0 :(得分:1)

在使用charts数组之前,您似乎没有导入 charts.js 文件。

您可以导入使用ChartsGrid组件的 charts.js 文件,并将charts作为道具传递:

import charts from './charts'
...
<ChartsGrid charts={charts} />

或者,您可以直接在 ChartsGrid.js 而不是charts中使用this.props对象。

import charts from './charts'

export default class ChartsGrid extends React.Component{
  render() {
    return (
      <div className="grid">
        {charts.map((chart, i) => 
          <Chart {...this.props} key={i} i={i} chart={chart} />)}
      </div>
    )
  }
}

请注意charts.map而不是this.props.charts.map,因为charts直接导入到文件中,而不是作为prop传递给组件(如第一个解决方案中所示)。

答案 1 :(得分:0)

使用react dev tools验证https://api.github.com/repos/my_company/my_project/pulls/123/comments是否作为数组进入。

如果您想要更好的答案,请添加将this.props.charts传递给charts的组件代码

答案 2 :(得分:0)

我认为您需要调用“ChartsGrid”标记并使用名称“charts”传递属性。像:

<ChartsGrid charts={}...>

我无法找到您使用'ChartsGrid'标签的位置。

答案 3 :(得分:0)

将ChartsGrid.js更改为

import React from 'react';
import Chart from './Chart';

export default class ChartsGrid extends React.Component{
  render() {
   if(this.props.charts){
     return (
       <div className="grid">
         {this.props.charts.map((chart, i) => <Chart {...this.props} key={i} i={i} chart={chart} />)}
       </div>
      )
    }
    else return(
       <div className="grid"></div>
    )
  }
};

答案 4 :(得分:0)

您缺少父组件

Parent.js

import ChartsGrid from './ChartsGrid';

const charts = [
  {name: 'Page A', uv: 4000, pv: 2400, amt: 2400},
  {name: 'Page B', uv: 3000, pv: 1398, amt: 2210},
  {name: 'Page C', uv: 2000, pv: 9800, amt: 2290},
];

class ParentComponent extends React.Component{
    render(){
        return(<ChartsGrid charts={charts}/>)
    }
}