未捕获的TypeError:无法读取未定义的属性'onDismiss'

时间:2017-03-14 13:43:13

标签: reactjs

我有一个React Component帖子:

import React, { Component } from 'react';

const list = [
  {
    title: 'React',
    url: 'https://facebook.github.io/react',
    author: 'Adam Beat',
    num_comments: 4,
    points: 3,
    objectID: 10,
  }, {
    title: 'Rails',
    url: 'https://www.rubyonrails.org',
    author: 'DHH',
    num_comments: 8,
    points: 4,
    objectID: 11,
  }
]

class Posts extends Component {

  constructor(props) {
    super(props); // call the constructor of the extended class
    this.state = { // bound state with the this object
      list: list,
    };
    this.onDismiss = this.onDismiss.bind(this);
  }

  onDismiss(id) {
    // const isNotId = item => item.objectID !== id;
    // const updatedList = this.state.list.filter(isNotId);
    const updatedList = this.state.list.filter(item => item.objectID !== id);
    this.setState({ list: updatedList });
  }

  render() {
    return (
      <div className="home-page ui container">
        {
          this.state.list.map(function(item) {
            return (
              <ul key={item.objectID}>
                <li>
                  <a href={item.url}>{item.title}</a>
                </li>
                <li>{item.author}</li>
                <li>{item.num_comments}</li>
                <li>{item.points}</li>
                <li>
                  <button
                    onClick={ () => this.onDismiss(item.objectID)}
                    type="button">
                    Dismiss
                  </button>
                </li>
              </ul>
            );
          })
        }
      </div>
    );
  }
}

export default Posts;

我正在尝试通过点击“关闭”按钮从列表中删除项目。

但实际上我得到一个错误:“未捕获的TypeError:无法读取未定义的属性'onDismiss'”

我错过了什么?

1 个答案:

答案 0 :(得分:6)

您正在使用this.state.list.map(function(item) { ... }),因此您的上下文是map函数的上下文。如果您将其更改为this.state.list.map(item => { ... }),它将有效。这是因为箭头函数会自动绑定到父this范围。在map函数中,没有onDismiss函数。

在构造函数中绑定this时,onDismiss函数将接收组件上下文。但是,您仍然必须通过组件功能,在这种情况下,您不会这样做。