我跟隨React Beginner Tutorial,我試圖把它翻譯成ES6。但是,當我將CommentBox
更改爲ES6類時,它開始給我一個this.props.url
錯誤(在loadCommentsFromServer
的AJAX調用中)爲undefined
錯誤。我認爲這與ES6如何綁定this
有關,但是我對語言(和React)不是很熟悉,所以我不確定。我看了看React 0.13 release notes,看到這一點:ES6 /反應「這個」關鍵字與AJAX從服務器獲取數據(教程)
React.createClass有一個內置的神奇功能,可以自動綁定的所有方法
this
你。對於其他類中不習慣此功能的JavaScript開發人員來說,這可能會有些混亂,或者當他們從React移動到其他類時會引起混淆。
我不能完全肯定,但我認爲,這意味着我必須這樣做的值保存(如let that = this
和.bind(that)
),但也作出了同樣的this.props.url
是undefined
- 我不知道在哪裏下一步。
這裏是我當前的代碼:
class CommentBox extends React.Component {
constructor(props) {
super(props);
this.state = {
data: []
};
}
loadCommentsFromServer() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({
data: data
})
}.bind(this)
});
}
handleCommentSubmit(comment) {
var comments = this.state.data;
var newComments = comments.concat([comment]);
this.setState({ data: newComments });
$.ajax({
url: this.props.url,
dataType: 'json',
type: 'POST',
data: comment,
success: function(data) {
this.setState({ data: data });
},
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
}
componentDidMount() {
this.loadCommentsFromServer();
setInterval(this.loadCommentsFromServer, this.props.pollInterval);
}
render() {
return (
<div className="commentBox">
<h1>Comments</h1>
<CommentList data={this.state.data}/>
<CommentForm onCommentSubmit={this.handleCommentSubmit}/>
</div>
);
}
};
由於我不能在這個實例中使用箭頭函數,我猜'bind(this)'是唯一的解決方案? – nathanhleung
我犯了一個錯誤之前,「this.loadCommentsFromServer()」不能綁定(這)。 –
順便說一句,如果你想使用箭頭函數,唯一的方法是這樣的:setInterval((=)=> {$ .ajax({url:this.props.url, dataType:'json', cache:false , 成功:功能(數據){ this.setState({ 數據:數據 }) } .bind(本) });},this.props.pollInterval); –