2016-03-30 31 views
0

私のnode.jsサーバーはsocket.ioで新しいデータを10秒ごとに送信します。私のWebアプリケーションでは、私のサーバがデータを送信しforceUpdate()で更新するたびにthis.stateを更新します。反応コンポーネントをリフレッシュする

しかし、私の反応コンポーネントはリフレッシュされません。私は、docに続くが、私は何か...

親逃した:

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; 

子供:

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; 

誰もがコンポーネントに反応マイ自動的に更新する方法を知っているが。

+0

が、同じresult:/ –

+0

役立つかもしれない...私は別の方法(componentDidUpdate、componentWillMount ...)に配置しようとした

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(); } 
onedkr

+0

親内部の設定が正しいように見えます。データはすべてのサイクルで新しいものでなければならず、setState()は親と子を再描画する必要があります(forceUpdate()も必要ありません)。ソケットが正しく動作していますか?複数のconsole.log行がありますか? – wintvelt

答えて

3

リアクションコンポーネントは、状態の変化を認識しないため更新されません。 Reactコンポーネントの更新は、毎回別のkey属性を使用して強制的に行うことができます。

`this.setState()`私は私の親コンポーネントでthis.setStateを()しています
+1

これは正解ではないので、あなたの状態を変更しないと 'setState'イベントを引き起こすことができます(http://jsfiddle.net/jwm6k66c/356/)、それはコンポネントを再レンダリングします –

+0

@The:あなたは正しい。しかし私は、setStateを手動で起動する必要はなく、データが変更されたときに応答したいと考えています。私はReactもそれと同様に動作することを期待していましたが、実際には状態が更新されていないため、更新されなかったサブコンポーネントがありました。だから私はいくつかの私のコンポーネントを使用していますこの "トリック"キー属性 –

+0

あなたの答えをありがとう:)私はより多くの精度が必要です。私の子コンポーネントでこのuniqueIdを正しく使うには?この一意のidを持つ瞬間、私のメソッドcomponentDidUpdate()は呼び出されません:/情報はすべて表示されます。 – onedkr

関連する問題