2016-09-21 1 views
0

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?

+1

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

+0

toll, ich kann Ihren Punkt sehen und irgendwie funktioniert es. Ich weiß nicht, ob dies eine gute Praxis ist oder nicht, aber danke –

+0

'this.state.data! = prevState.data' wird dir immer' true' geben. Sie brauchen etwas wie '_.isEqual()' von lodash –

Antwort

0

Der beste Weg, dies zu tun, besteht darin, den Datenzustand nur zu aktualisieren, wenn er sich von dem vorherigen unterscheidet. Zum Beispiel:

componentDidMount(){ 
    this.ajaxRequest().done((data)=>{ 
     if(data !== this.state.data){ 
      this.setState({data: data, showNotif: true}) 
    }) 

Aber wenn Sie jedes Mal, Zustand aktualisieren möchten, und Änderungen zu überprüfen, die einen besseren Ort ist componentWillReceiveProps:

componentWillReceiveProps(nextProps, nextState) { 
    if (this.state.data != nextState.data) { 
     this.setState({showNotif: true}); 
    } 
} 

Der Unterschied besteht darin, dass, wenn Sie Datenzustand zu ändern, es Komponente Rendering verursachen Anschließend rendern Sie in componentDidUpdate die Komponente zum zweiten Mal (nächster setState). Wenn Sie componentWillReceiveProps - Component render nur einmal verwenden.

Verwandte Themen