私はReactとES6を学びました。私は公式のチュートリアルをとり、ES6と互換性を持たせるために遊びました。しかし、それはAjaxリクエストを実行することになると、私は次のエラーを取得する:ReactJSコードでthis.propsが定義されていないのはなぜですか?
import React from 'react';
import CommentList from './CommentList.js';
import CommentForm from './CommentForm.js';
export default class CommentBox extends React.Component {
constructor(props) {
super(props);
console.log(this.props)
this.state = {
data: []
}
}
loadCommentsFromServer() {
$.ajax({
url: this.props.url,
dataType: 'json',
cache: false,
success: function(data) {
this.setState({data: data});
}.bind(this),
error: function(xhr, status, err) {
console.error(this.props.url, status, err.toString());
}.bind(this)
});
}
handleCommentSubmit(comment) {
let comments = this.state.data;
// Optimistically set id on the new comment.
// It will be replaced by an id generated by the server.
// In a production you would have a more robust system in place.
comment.id = Date.now();
let 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});
}.bind(this),
error: function(xhr, status, err) {
this.setState({data: comments});
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>
);
}
}
エラーがloadCommentsFromServer
に起こる;:
CommentBox.js:23 Uncaught TypeError: Cannot read property 'url' of undefined
ここに私のCommentBoxファイル/コードがありますthis.props
が何であるかわからないようです。私はそれがこの参照の問題だと思って、similar questionを見つけました。問題を解決するために新しいES6の矢印を使用することをお勧めします。私はその後試しました:loadCommentsFromServer =() => {}
、しかし、Browserifyは文句を言ってビルドしません。
[コールバック内の正しい\ 'this \' /コンテキストにアクセスするにはどうすればいいですか?](http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context -inside-a-callback) –
「共通の問題:コールバック/イベントハンドラとしてのオブジェクトメソッドの使用」を参照してください。 –
手動でバインドする必要があります。 ES6クラスはオートバイではありません – thangngoc89