Hallo Jungs im neuen in reactjs Ich möchte nur die Reaktion Weg, Methode/Lebenszyklus, Komponente (Benachrichtigungskomponente) zu rendern, wenn Ajax Daten Ergebnis unterscheidet sich mit vorherigen Zustand?reactjs: Wie man Daten ändert und Benachrichtigung zeigt
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>
);
});
wenn Sie also kann ich erwarten, sehen die ComponentDidUpdate
wird die geänderte state.data lesen und wenn sie (gemeint ist der Ajax-Ergebnis hat neue aktualisierte) geändert hat, wird es this.state.showNotif
zu true
gesetzt und machen wird showNotification()
nennen, aber es ist nicht (es blinkt, stimmt-falsch setzt hin und her, so heißt es oft)
was soll ich tun, um es zu erreichen und es richtig zu machen?
Ich denke, dass Sie überprüfen sollten, ob die neuen Daten * vor * in Zustand zu speichern, wie 'if (isDifferent (this.state.data, ajaxData)) {this.setState ({data: ajaxData, showNotif: true })} – ezakto
toll, ich kann Ihren Punkt sehen und irgendwie funktioniert es. Ich weiß nicht, ob dies eine gute Praxis ist oder nicht, aber danke –
'this.state.data! = prevState.data' wird dir immer' true' geben. Sie brauchen etwas wie '_.isEqual()' von lodash –