componentDidUpdate之后的繪制

componentDidUpdate是更新版的componentDidMount方法。在這里可以處理本地的UI元素,可以操作refs,有需要的話也可以開啟另外一個(gè)繪制過程。

componentDidUpdate方法會傳入兩個(gè)參數(shù):prevProps, prevState。這個(gè)正好和componentWillUpdate是相對的。這個(gè)兩個(gè)參數(shù)的值就是在方法調(diào)用之前的this.propsthis.state。

react-tree-update.png

就如同componentDidMount,componentDidUpdate在所有的子組件都更新之后被調(diào)用。如上圖,A.0.0componentDidUpdate會先調(diào)用,然后是A.0的,最后才是A的。

如何使用

使用componentDidUpdate最一般的情況就是管理第三個(gè)的UI組件,以及和本地UI元素交互。比如你使用了Chart庫之后:

componentDidUpdate(prevProps, prevState) {
  // 如果數(shù)據(jù)發(fā)生變化,則更新圖表
  if(prevProps.data !== this.props.data) {
    this.chart = c3.load({
      data: this.props.data
    });
  }
}

在數(shù)據(jù)發(fā)橫變化之后,更新圖表

其他繪制過程

我們也可以查找本地的UI元素、獲取大小和css的樣式等。我們可以更新子組件。這時(shí),可以調(diào)用this.setState或者forceUpdate。但是,這樣也會引起很多的其他問題。

最糟糕的問題就是在沒有檢查條件的情況下直接調(diào)用setState方法:

componentDidUpdate(prevProps, prevState) {
  let height = ReactDOM.findDOMNode(this).offsetHeight;
  this.setState({
    internalHeight: height
  });
}

默認(rèn)情況下shouldComponentUpdate方法返回的是true。所以,如果我們用了上面的方法,我們會進(jìn)入無限循環(huán)的狀態(tài)。

總的來說,一般不需要這么做。而且這樣的重繪會造成性能問題。

原文地址:https://developmentarc.gitbooks.io/react-indepth/content/life_cycle/update/postrender_with_componentdidupdate.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容