错误:无法读取未定义的属性“map”

问题描述 投票:0回答:11

我正在遵循

reactjs
教程,当
将值从一个组件的状态传递到另一个组件时,我一直遇到问题

错误

Cannot read property 'map' of undefined'
当执行
map
组件中的
CommentList
函数时抛出。

当从

prop
进入
undefined
时,什么会导致
CommentBox
变成
CommentList

// First component
var CommentList = React.createClass({
  render: function() {
    var commentNodes = this.props.data.map(function (comment){
      return <div><h1>{comment.author}</h1></div>;
    });
    return <div className="commentList">{commentNodes}</div>;
  }
});
// Second component    
var CommentBox = React.createClass({
   getInitialState: function(){
     return {data: []};
   },
   getComments: function(){
      $.ajax({
        url: this.props.url,
        dataType: 'json',
        success: function(data){ this.setState({data: data}) }.bind(this),
        error: function(xhr, status, err){ console.error(url, status, err.toString()) }.bind(this)
      });
   },
   componentWillMount: function(){
      this.getComments()
   },
   render: function(){
      return <div className="commentBox">{<CommentList data={this.state.data.comments}/>}</div>;
   }
});

React.renderComponent( <CommentBox url="comments.json" />, document.getElementById('content'));
reactjs
11个回答
70
投票

首先,设置更安全的初始数据:

getInitialState : function() {
    return {data: {comments:[]}};
},

并确保你的ajax数据。

如果您遵循上述两个说明(如演示),它应该可以工作。

更新:您可以用条件语句包装 .map 块。

if (this.props.data) {
  var commentNodes = this.props.data.map(function (comment){
      return (
        <div>
          <h1>{comment.author}</h1>
        </div>
      );
  });
}

14
投票

我想你忘记换衣服了

data={this.props.data}

data={this.state.data}

在CommentBox的渲染函数中。当我遵循教程时,我犯了同样的错误。因此整个渲染函数应该看起来像

render: function() {
  return (
    <div className="commentBox">
      <h1>Comments</h1>
      <CommentList data={this.state.data} />
      <CommentForm />
    </div>
  );
}

而不是

render: function() {
  return (
    <div className="commentBox">
      <h1>Comments</h1>
      <CommentList data={this.props.data} />
      <CommentForm />
    </div>
  );

11
投票

渲染前需要放入数据

应该是这样的:

var data = [
  {author: "Pete Hunt", text: "This is one comment"},
  {author: "Jordan Walke", text: "This is *another* comment"}
];

React.render(
  <CommentBox data={data}/>,
  document.getElementById('content')
);

而不是这个:

React.render(
  <CommentBox data={data}/>,
  document.getElementById('content')
);

var data = [
  {author: "Pete Hunt", text: "This is one comment"},
  {author: "Jordan Walke", text: "This is *another* comment"}
];

7
投票

如果

"Cannot read property 'map' of undefined"
有错误或者没有props.data数组,就会遇到错误
"this.props.data"

更好地设置条件来检查数组,如

if(this.props.data){
this.props.data.map(........)
.....
}

6
投票

我考虑在taggon对这个问题的回答下发表评论,但是,我觉得对于那些对细节感兴趣的人来说,它应该有更多的解释。

未捕获的类型错误:无法读取未定义的属性“值”严格来说是一个 JavaScript 错误。
(请注意,值可以是任何值,但对于此问题,值是“地图”)

了解这一点至关重要,这样您就可以避免无休止的调试循环。
这个错误很常见,尤其是刚开始使用 JavaScript(及其库/框架)时。
对于

React
,这与理解 组件生命周期方法有很大关系。

// Follow this example to get the context
// Ignore any complexity, focus on how 'props' are passed down to children

import React, { useEffect } from 'react'

// Main component
const ShowList = () => {
  // Similar to componentDidMount and componentDidUpdate
  useEffect(() => {// dispatch call to fetch items, populate the redux-store})

  return <div><MyItems items={movies} /></div>
}

// other component
const MyItems = props =>
  <ul>
    {props.items.map((item, i) => <li key={i}>item</li>)}
  </ul>


/**
  The above code should work fine, except for one problem.
  When compiling <ShowList/>,
  React-DOM renders <MyItems> before useEffect (or componentDid...) is called.
  And since `items={movies}`, 'props.items' is 'undefined' at that point.
  Thus the error message 'Cannot read property map of undefined'
 */

作为解决这个问题的一种方法,@taggon 给出了一个解决方案(请参阅第一个 anwser 或链接)。

解决方案:设置初始/默认值。
在我们的示例中,我们可以通过声明空数组的

items
值来避免
default
“未定义”。

为什么?这允许 React-DOM 最初渲染一个空列表。
当执行
useEffect
componentDid...
方法时,组件将使用填充的项目列表重新渲染。

// Let's update our 'other' component
// destructure the `items` and initialize it as an array

const MyItems = ({items = []}) =>
  <ul>
    {items.map((item, i) => <li key={i}>item</li>)}
  </ul>

4
投票

这是我的问题:

{props.users.map((item,index)=>(
    <div className="items" key={index}>
        <div className="text-center">
            <p className="fs-12">{item}</p>
        </div>
    </div>
))}

然后我刚刚通过添加此代码解决了问题。它的工作原理就像 if 和 else 语句一样。

{ props.users ? props.users.map((item,index)=>(
        <div className="items" key={index}>
            <div className="text-center">
                <p className="fs-12">{item}</p>
            </div>
        </div>
)) : <p>Users is empty</p>}

2
投票

出现这个错误主要是因为没有找到数组。只需检查您是否已映射到正确的数组即可。检查数组名称或声明。


0
投票

这对我有用。如果我使用 props.worktyp.map 它会抛出一个错误:地图未定义。

//App.js
    const worktyp = [
          "Full-time",
          "casual",
          "part-time",
          "contract"
        ];
    
    function Main(props){
      return(
    <section>
      <p>This the main body</p>
      <ul style = {{textAlign:"left"}}>
        **{worktyp.map((work) => <li>{work}</li>)}**
      </ul>
    </section>
    
      );
        }
 function App() {
      return (
        <div className="App">
          <Header name="initial"/>
          **<Main work={worktyp}/>**
          <Foot year ={new Date().getFullYear()}/>
        </div>
      );
    }
//index.js
    ReactDOM.render(
     <App />,
      document.getElementById('root')
    );

0
投票

api调用数据时react js 应用程序:[{程序名称:“字符串”,状态:“重复”}]


0
投票

在我的例子中,我通过添加“?”解决了这个错误。状况。

之前:

<div className="hotelContainer__img">
              {photos.map((item, index) => (
                <img
                  src={item}
                  alt=""
                  key={index}
                  onClick={() => handleOpen(index)}
                />
              ))}
            </div>

之后

<div className="hotelContainer__img">
              {photos?.map((item, index) => (
                <img
                  src={item}
                  alt=""
                  key={index}
                  onClick={() => handleOpen(index)}
                />
              ))}
            </div>

0
投票

就我而言,当我尝试向

Promise.all
处理程序添加类型时,就会发生这种情况:

Promise.all([1,2]).then(([num1, num2]: [number, number])=> console.log('res', num1));

如果删除

: [number, number]
,错误就会消失。

© www.soinside.com 2019 - 2024. All rights reserved.