如何正确访问这个'内部地图:ReactJS

时间:2017-04-23 07:05:52

标签: javascript reactjs

例如,我有一个带有两种绑定方法的react组件:

import React from 'react';

class Comments extends React.Component {
    constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleRemoveComment = this.handleRemoveComment.bind(this);
    }

    handleSubmit(e) {
        .....
    }

    handleRemoveComment(e) {
        //this.props.removeComment(null, this.props.params, i);
    }

    renderComment(comment, i) {
        return(
            <div className="comment" key={i}>
                  .....
                  <button 
                       onClick={this.handleRemoveComment}
                       className="remove-comment">
                       &times;
                  </button>
            </div>
        )
    }

    render() {
        return(
            <div className="comments">

                {this.props.postComments.map(this.renderComment)}

                .....
            </div>
        )
    }
}

export default Comments;

在上面的代码中,我有两种绑定方法:一种是handleSubmit,一种是handleRemoveCommenthandleSubmit功能有效但handleRemoveComment没有。运行时,它返回错误:

  

TypeError:无法读取属性&#39; handleRemoveComment&#39;未定义的

1 个答案:

答案 0 :(得分:5)

问题在于这一行:

{this.props.postComments.map( this.renderComment )}

因为您忘记绑定renderComment,所以映射回调方法,因此this方法中的renderComment将不会引用类上下文。

使用任何一个这些解决方案,它都可以。

1 - constructor中使用此行:

this.renderComment = this.renderComment.bind(this) ;

2 - this一起传递map,如:

{this.props.postComments.map(this.renderComment, this)}

3 - 使用箭头功能和renderComment方法,如下所示:

renderComment = (comment, i) => {
    .....

或使用renderComment函数中的地图(我以前喜欢这种方式),如下所示:

renderComment() {
    return this.props.postComments.map((comment, i) => {
        return(
            <div className="comment" key={i}>
                <p>
                    <strong>{comment.user}</strong>
                    {comment.text}
                    <button 
                        onClick={this.handleRemoveComment}
                        className="remove-comment">
                        &times;
                    </button>
                </p>
            </div>
        )
    })
}

render调用此方法,在这种情况下,不需要绑定renderComment

{this.renderComment()}