【问题标题】:Cannot Read Property map of undefined无法读取未定义的属性映射
【发布时间】:2017-01-31 17:27:12
【问题描述】:

由于某种原因,它有时会映射,但我得到另一个错误,即不返回任何内容,有时它只是说无法读取未定义的属性映射。我正在尝试在 React 中编译用户列表。

我有一个名为 UserList 的组件正在查询我的数据库中的所有用户并更新状态:

const UserList = React.createClass({
  getInitialState: function () {
    return {
      users: []
    }
  },
  componentDidMount: function () {
    this.loadUsersFromServer();
  },
  loadUsersFromServer: function () {
    axios.get('/api/users').then((users) => {
      this.setState({users: users.data.users});
    });
  },
  render: function () {
    return (
      <div>

        <h1>User List</h1>

        <User
          users={this.state.users}
        />

      </div>
    );
  },
});

然后我将它传递给它的子组件用户,这就是错误发挥作用的地方:

const User = React.createClass({


  render: function () {
    console.log('props: ' + JSON.stringify(this.props.users));

    const users = this.props.users.map((user) => {
      return (
        <User
          key={user._id}
          username={user.username}
        />
      );
    });

    return (
      <div id="users">
        {users}
      </div>
    );
  },
});

Chrome 开发工具的有趣之处在于,由于某种原因,我在尝试打印 this.props.users 时得到了三个日志,我不确定为什么它会注销三个,但中间的一个有所有我正在寻找的用户:

任何帮助将不胜感激!

【问题讨论】:

  • 我自己对 React 很陌生,所以我主要是跟着看其他人的答案。但是,我正在使用 extends React.Component 语法,它为我提供了一个构造函数来用于初始状态。我没有尝试使用该语法呈现的空数组 [] 的问题。
  • 是的,我的意思是我可以尝试我想......我只知道这是写同一件事的两种不同方式,所以我无法想象这会是问题所在。或者至少我有点希望问题不会是那样的哈。
  • 在您的 User 类渲染方法中。您正在渲染一堆用户组件。这是某种我不太了解的递归自我引用。在你的地图函数中,你想返回一个
    还是其他东西而不是
  • 第一次运行 map 函数时,您正在创建一个具有 'key' 和 'username' 属性的 组件,因此此时未定义 'users' 属性。
  • @TomCoughlin 啊...好点。我什至需要将它映射到一个组件中,还是我可以将它放入一个 div 中?

标签: javascript mongodb reactjs


【解决方案1】:

您可以尝试将用户呈现逻辑放入 UserList 类的方法中。接近这个的东西应该可以工作。

const UserList = React.createClass({
  getInitialState: function () {
    return {
      users: []
    }
  },
  componentDidMount: function () {
    this.loadUsersFromServer();
  },
  loadUsersFromServer: function () {
    axios.get('/api/users').then((users) => {
      this.setState({users: users.data.users});
    });
  },
  renderUsers: function (users) {
    return <div>{users.map(user => <div key={user._id} username={user.username} />)}</div>
  },
  render: function () {
    return (
      <div>
        <h1>User List</h1>
        { this.renderUsers(this.state.users) }
      </div>
    );
  },
});

【讨论】:

  • 是的!我相信这会奏效......我将对此进行一些修改,然后我会给你答案。非常感谢您指出这一点!
  • 没问题! @TaylorKing
【解决方案2】:

在某个时刻(第二次刷新)this.props.users 看起来未定义,地图函数无法处理它。

我使用 React.Component 语法重写了示例,因为我从未使用过旧的 React(V0.13 之前)语法。

检查更多不同的语法here

但是,这部分:

const User = React.createClass({
  render: function () {
    console.log('props: ' + JSON.stringify(this.props.users));

    const users = this.props.users.map((user) => {
      return (
        <User
          key={user._id}
          username={user.username}
        />

看起来很奇怪。我认为您在 User 中使用了 User。

这是我重写它的方法,由于我没有用户 axios,所以做了一些小的修改。


class UserList extends React.Component{
  constructor(props){
    super(props);      
    this.state = { users : []  };
  }  
  componentDidMount() {    
    this.loadUsersFromServer();    
  }
  loadUsersFromServer(){      
    this.setState({users: 
                  
                  [{
  "_id": 1,
  "username": "Nicole",
  "password": "0uTjaH",
  "_v": "7.6.9"
}, {
  "_id": 2,
  "username": "Steve",
  "password": "22l8h6a8NPU",
  "_v": "7.41"
}, {
  "_id": 3,
  "username": "Joyce",
  "password": "yA3efEc",
  "_v": "6.3"
}, {
  "_id": 4,
  "username": "Todd",
  "password": "7LsQ9aHqIfhy",
  "_v": "7.1"
}, {
  "_id": 5,
  "username": "Maria",
  "password": "uHZ5fkCi04v",
  "_v": "9.31"
}]
                  
                  
                  });
  }
  
  render(){    
    return (
      <div>
        <h1>User List </h1>
        <User users={this.state.users}   />
      </div> 
    );
  }
};

class User extends React.Component{
  constructor(props){
    super(props);
  }
  
  render(){
    console.log(typeof(this.props.users));
    //console.log(this.props.users);

    //const user = JSON.stringify(this.props.users);
    
    const userList = this.props.users.map((user) => {
      return (
        <div>
          <span>key={user._id}</span>
          <span>username={user.username}</span>
        </div>
      );
    });

    return (
      <div id="users">
        {userList}
      </div>
    );
  }
  
}

ReactDOM.render(<UserList /> , document.getElementById('root') );
span {padding: 3px}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

【讨论】:

  • 不幸的是,这并不能解决我的问题。 :/我在其他地方也看到过这个建议,但我继续尝试了。还是什么都没有。
  • 这个答案有意义吗@TaylorKing?
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2018-01-07
  • 2022-06-21
  • 2021-08-31
  • 2017-05-21
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多