私はreactjsで新しい人です ajaxデータの結果が前の状態と異なる場合、コンポーネント(通知コンポーネント)をレンダリングできる反応方法、メソッド/ライフサイクルを知りたいだけですか?reactjs:データが変更されたことを検出して通知を表示する方法
var NewsList = React.createClass({
getInitialState: function() {
return ({
data: [],
showNotif: false,
showLoading: false
});
},
showNotification: function() {
return (
<Notification msg="new data" />
);
},
ajaxRequest: function() {
//do ajax request, load the result to this.state.data
},
componentWillMount: function() {
this.setState({showLoading: true});
},
componentDidMount: function() {
this.ajaxRequest();
setInterval(this.ajaxRequest, 2000);
},
componentDidUpdate: function(prevProps, prevState) {
if (this.state.data != prevState.data) {
//this.setState({showNotif: !this.state.showNotif});
}
},
render: function() {
var loadingElement, notifElement;
if (this.state.showLoading) {
loadingElement = <Loader />
}
if(this.state.showNotif) {
notifElement = this.showNotification();
}
return (
<div>
{notifElement}
{loadingElement}
<NewsItem data={this.state.data} />
</div>
);
});
ので、あなたは私がComponentDidUpdate
が変更されたstate.dataを読むことを期待し、それが(新しい更新したAJAX結果を意味する)変わったのならば、それはtrue
にthis.state.showNotif
を設定し、showNotification()
を呼び出しますレンダリングします見ることができますが、それはだ場合(点滅している、真偽が前後に設定されているので何度も呼び出される)
これを達成して正しくするためにはどうすればよいですか?
もしあなたが 'if(isDifferent(this.state.data、ajaxData)){this.state.data、{data:ajaxData、showNotif:trueのように状態を保存する前に新しいデータが* })} ' – ezakto
素晴らしい、私はあなたのポイントを見ることができ、何とかそれは働いています。これは良い練習かどうか分かりませんが、ありがとうございます。 –
'this.state.data!= prevState.data'はいつも' true'を与えます。あなたはlodashから '_.isEqual()'のようなものが必要です –