像componentDidUpdate这样的事件,但只触发一次

时间:2015-02-09 21:01:30

标签: javascript reactjs

我有一些组件,一旦他们的数据第一次到达并呈现就应该做一些工作,但不会用于将来的重新渲染。例如:加载并呈现评论,现在1.加载社交媒体库,然后加载一些Google Analytics。

现在我这样做:

componentDidUpdate: function (prevProps, prevState) {
    if (this.hasAlreadyUpdatedOnce) {
        // ... do some stuff...
    } else {
        // ... do some stuff that should happen only once...
        // 1. load social media libraries
        // 2. load some Google Analytics
        this.hasAlreadyUpdatedOnce = true;
    }
}

但是我问自己,是否有比设置这样的财产更优雅的方式。

5 个答案:

答案 0 :(得分:5)

你想要componentDidMount()Details here.

答案 1 :(得分:4)

假设您正在响应状态更改,则应将回调作为setState的第二个参数传递。

componentDidMount: function(){
  ajaxyThing(function(data){
    this.setState({data: data}, function(){
      // this.state is updated, the component has rerendered 
      // and the dom is current
    });
  }.bind(this));
}

答案 2 :(得分:0)

ajax调用完成后,您是否尝试更新状态? 或者,您可以为componentShouldUpdate返回false,并且一旦ajax调用promise已解析call forceUpdate。

答案 3 :(得分:0)

我不能给你一个确定的答案,因为我不知道你的ajax调用是在父组件还是子组件中,但无论哪种方式,你都应该能够利用shouldComponentUpdate()来实现你的目标。如果您真的不希望在ajax调用进入后更新组件,那么您可以执行以下操作:     shouldComponentUpdate(){       返回false;     }

然后当您的ajax调用返回时,只需运行this.forceUpdate()。返回false将使您的组件永远不会更新,除非您运行this.forceUpdate()。然而,这不是问题的最佳解决方案,如果没有更多信息,我就无法提供更好的解决方案。

答案 4 :(得分:0)

React docs就如何使用isMounted()处理此问题提供了一个很好的示例。

  如果将组件呈现到DOM中,则

isMounted()返回true,   否则是假的。您可以使用此方法来保护异步调用   到setState()forceUpdate()

示例

首先,在`getInitialState()':

中初始化状态变量
getInitialState: function() {
  return {
    username: '',
    lastGistUrl: ''
  }
}

componentDidMount()中进行ajax调用(本例中为$.get),然后重新设置状态变量:

componentDidMount: function() {
  $.get(this.props.source, function(result) {
    var lastGist = result[0];
    if (this.isMounted()) {
      this.setState({
        username: lastGist.owner.login,
        lastGistUrl: lastGist.html_url
      });
    }
  }.bind(this));
}