例如,我有一个带有两种绑定方法的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">
×
</button>
</div>
)
}
render() {
return(
<div className="comments">
{this.props.postComments.map(this.renderComment)}
.....
</div>
)
}
}
export default Comments;
在上面的代码中,我有两种绑定方法:一种是handleSubmit
,一种是handleRemoveComment
。 handleSubmit
功能有效但handleRemoveComment
没有。运行时,它返回错误:
TypeError:无法读取属性&#39; handleRemoveComment&#39;未定义的
答案 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">
×
</button>
</p>
</div>
)
})
}
从render
调用此方法,在这种情况下,不需要绑定renderComment
:
{this.renderComment()}