2016-03-30 3 views
0

Мой сервер node.js отправляет с socket.io новые данные каждые 10 секунд. В моем веб-приложении я обновляю this.state каждый раз, когда мой сервер отправляет данные и принудительно обновляется с помощью forceUpdate()Обновить компонент реагирования

Однако мой компонент реагирования не обновляется, я не знаю почему. Я последовал за документ, но я что-то пропустил ...

Родитель:

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

'this.setState()' может помочь вам –

+0

меня this.setState() в моем родительском компоненте ... Я попытался поместить его в другой метод (componentDidUpdate, componentWillMount ...), но это же результат:/ – onedkr

+0

Ваша настройка внутри родителя выглядит корректно: данные должны быть новыми в каждом цикле, а setState() должен повторно отображать родительский + дочерний элемент, даже не требуя применения forceUpdate(). Вы уверены, что сокет работает правильно? Вы получаете несколько строк console.log? – wintvelt

ответ

3

Компонент React не обновляется, потому что он не понимает, что это состояние изменяется. Вы можете принудительно обновить компонент React, создавая его каждый раз с помощью другого атрибута key.

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

Это неправильный ответ, вы можете вызвать событие 'setState', если вы не измените свое состояние [скрипка] (http://jsfiddle.net/jwm6k66c/356/), и оно будет повторно отображать compoenent –

+0

@The: you являются правильными. Но я думаю, что он хочет, чтобы он реагировал на изменения данных, без необходимости вручную запускать setState. Я ожидал, что React тоже будет работать, но у меня были субкомпоненты, которые не обновлялись, потому что их состояние не обновлялось. Поэтому я использую на некоторых из моих компонентов этот «трюк» с ключевым атрибутом –

+0

Спасибо за ваш ответ :) Но мне нужна более высокая точность. Как правильно использовать этот uniqueId на моем дочернем компоненте? На данный момент с этим уникальным id мой метод componentDidUpdate() не вызывается: /, поэтому отображаются любые данные. – onedkr

Смежные вопросы