2016-03-30 24 views
0

Node.js sunucum her 10s'de socket.io yeni veri ile gönderir. Web uygulamamda sunucumun verileri gönderdiği ve forceUpdate()Yenileme bileşenini yenileyin

ile güncellemeye zorladığım her zaman this.state'i güncellerim. Ancak, reaksiyon bileşenim yenilenmiyor, nedenini bilmiyorum. Ben doktor izledi ama bir şey ...

Veli cevapsız:

class DataAnalytics extends React.Component { 
    constructor(props) { 
    super(props); 
    socket = this.props.socket; 
    this.state = {data: []}; 

    socket.on('dataCharts', (res) => { 
     console.log("new data charts : "+res); 
     var data = JSON.parse(res); 
     this.setState({data: data}); 
     this.forceUpdate(); 
    }); 
    } 

    componentWillUnmount() { 
    socket.off('dataCharts'); 
    } 

    render() { 
    return (
    <div id="dataAnalytics"> 
     <Stats data={this.state.data}></Stats> 
    </div> 
    ); 
    } 
} 

export default DataAnalytics; 

Çocuk:

class Stats extends React.Component { 
    constructor(props) { 
    super(props); 
    } 

    render() { 
    return (
     <div className="stats" style={{textAlign:'center'}}> 
     <h4>Number: </h4> 
     </div> 
    ); 
    } 

    componentDidUpdate() { 
    var data = this.props.data; 

    if(!jQuery.isEmptyObject(data)) { 
     $(".stats").html("<h4>Number : data['nb']['counterIn']</h4>"); 
    } 
    } 
} 

export default Stats; 

Herkes bileşenini Tepki Gözat otomatik olarak yenilenmez biliyorum.

+0

'this.setState()' Size –

+0

iyi gelebilir ... Farklı yönteminde (componentDidUpdate, componentWillMount ...) yerleştirmek için çalıştı Benim ana bileşende this.setState() var ama aynı result:/ – onedkr

+0

İçerideki ebeveyniniz doğru görünüyor: veriler her döngüde yeni olmalı ve setState() öğesi, forceUpdate() öğesine gerek duymadan parent + child öğesini yeniden oluşturmalıdır. Soketin düzgün çalıştığından emin misin? Birden çok konsol.log satırı var mı? – wintvelt

cevap

3

React bileşeni, durumun değiştiğini fark etmediğinden güncellenmiyor. Her seferinde farklı bir key özniteliği ile oluşturarak bir Tepki bileşenindeki bir güncelleştirmeyi zorlayabilirsiniz.

render() { 
    return (
     <div id="dataAnalytics"> 
      <Stats key={this.uniqueId()} data={this.state.data}></Stats> 
     </div> 
    ); 
} 

// Example of a function that generates a unique ID each time 
uniqueId: function() { 
    return new Date().getTime(); 
} 
+1

doğru cevap değil, durumunuzu değiştirmezseniz setState olayını tetikleyebilirsiniz [fiddle] (http://jsfiddle.net/jwm6k66c/356/) ve bileşen –

+0

@The: doğru Ama sanırım setState'i manuel olarak tetiklemek zorunda kalmadan veri değiştiğinde cevap vermesini istiyor. React'ın da böyle çalışmasını bekliyordum, ama durumunun güncellenmemesi nedeniyle güncelleme yapmayan alt bileşenlerim vardı. Bu yüzden bazı bileşenlerimi kullanıyorum –

+0

anahtar özelliğiyle bu "hile" cevabınız için teşekkür ederim :) Ama daha fazla kesinlike ihtiyacım var. Çocuk bileşenimde bu uniqueId nasıl doğru şekilde kullanılır? Bu benzersiz kimlik ile şu an için componentDidUpdate() yöntemim çağrılmıyor: herhangi bir bilgi görüntülenecektir. – onedkr

İlgili konular