【问题标题】:Refresh react component刷新反应组件
【发布时间】:2016-03-30 14:10:49
【问题描述】:

我的 node.js 服务器每 10 秒发送一次 socket.io 新数据。在我的网络应用程序中,每次我的服务器发送数据并使用 forceUpdate() 强制更新时,我都会更新 this.state

但是,我的反应组件没有刷新,我不知道为什么。我跟着文档,但我错过了一些东西......

家长:

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;

任何人都知道如何自动刷新我的 React 组件。

【问题讨论】:

  • this.setState() 可能会帮助你
  • 我的父组件中有 this.setState()... 我尝试将它放在不同的方法中(componentDidUpdate、componentWillMount ...),但结果相同:/
  • 您在 parent 中的设置看起来是正确的:每个周期的数据都应该是新的,并且 setState() 应该重新渲染 parent +child,甚至不需要 forceUpdate()。你确定插座工作正常吗?你有多个 console.log 行吗?

标签: javascript reactjs


【解决方案1】:

React 组件不会更新,因为它没有意识到它的状态发生了变化。您可以通过每次使用不同的 key 属性创建 React 组件来强制更新它。

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

【讨论】:

  • 这不是正确答案,如果你不改变你的状态fiddle,你可以触发setState事件,它会重新渲染组件
  • @The:你是对的。但我认为他希望它在数据更改时做出响应,而不必手动触发 setState。我期待 React 也能像这样工作,但我的子组件没有更新,因为它们的状态没有真正更新。所以我在我的一些组件上使用了这个带有 key 属性的“技巧”
  • 感谢您的回答 :) 但我需要更精确。如何在我的子组件上正确使用这个 uniqueId ?目前,使用这个唯一 ID 我的方法 componentDidUpdate() 没有被调用:/ 所以显示任何信息。
  • @RaulRene 我明白了,我还没有遇到过类似的事情
  • 只有当你有一个孩子列表并且一些孩子没有正确重新渲染时,键中唯一 ID 的技巧才有意义。 (不过,我会建议使用更合适和更有效的密钥)。 OP 的问题与列表无关,所以我怀疑 key/ID 会解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2022-06-29
  • 2019-10-14
  • 2020-09-29
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多