1. 程式人生 > >【React】歸納篇(六)元件物件的生命週期 | 例項 | 虛擬DOM與DOM Diff演算法

【React】歸納篇(六)元件物件的生命週期 | 例項 | 虛擬DOM與DOM Diff演算法

元件物件的生命週期

元件物件的生命週期,指的是從元件物件產生到銷燬的過程。

如下圖所示: 這裡寫圖片描述

生命週期的回撥函式:你定義了,你沒有呼叫,但是這個函式卻執行了。如render()函式。也稱為生命週期的“鉤子函式”。

透明度改變動畫-例項

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta
http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title> </head> <body> <div id="test1"></div> <script src="https://cdn.bootcss.com/react/16.4.0/umd/react.development.js"></script> <script src="https://cdn.bootcss.com/react-dom/16.4.0/umd/react-dom.development.js"
>
</script> <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script> <script src="../js/prop-types.js"></script> <script type="text/babel"> //1、定義類元件 class Life extends React.Component { constructor(props) { super(props); //初始化狀態
this.state = { opacity: 1 } this.distroyComponent = this.distroyComponent.bind(this); } distroyComponent() { ReactDOM.unmountComponentAtNode(document.getElementById('test1')); } componentDidMount() { //啟動迴圈定時器 this.id_interval = setInterval(function(){ console.log(1); let {opacity} = this.state; opacity -= 0.1; if(opacity<=0){ opacity = 1; } this.setState({opacity}); }.bind(this),200) } componentWillUnmount() {//元件將被解除安裝前觸發 clearInterval(this.id_interval); } render() { const {opacity} = this.state; //
{{物件}}與{JS程式碼}的區別 return ( <div> <h2 style={{opacity:opacity}}>{this.props.msg}</h2> <button onClick={this.distroyComponent}>Click Me to unmount the component</button> </div> ) } } //2、渲染元件 ReactDOM.render(<Life msg="元件物件的生命週期"/>,document.getElementById('test1')); </script> </body> </html>

小結下,元件物件的生命週期流程分為3個階段:

1、第一次初始化渲染顯示:ReactDOM.render() ,只會執行一次

  • constructor():建立物件初始化state
  • componentWillMount():將要插入回撥
  • render():用於插入虛擬DOM回撥
  • componentDidMount():已經插入回撥

2、每次更新:state.this.setState() ,可以執行N次

  • componentWillUpdate() 將要更新回撥
  • render() 更新,進行重新渲染
  • componentDidUpdate() 已經更新回撥

3、移除元件:ReactDOM.unmountComponentAtNode(containerDOM),只會執行一次

  • componentWillUnmount():元件將要被移除回撥

總的來說,有4個鉤子比較重要:

  • render
  • componentDidMount
  • componentWillUnmount
  • componentWillReceiveProps

聯想下 人的生命週期,從“出生-成長-死亡”,其實很類似這樣的過程。

虛擬DOM與DOM Diff演算法

DOM Diff 演算法:只更新需要更新的部分。 虛擬DOM:在操作介面的過程中,介面是不會變的。

元件初始化過程:

  • 1、建立虛擬DOM樹
  • 2、生成真實DOM樹
  • 3、繪製介面顯示

思考:更新時,如何做到最小化重繪:

  • 1、setState()更新狀態
  • 2、重新建立虛擬DOM樹
  • 3、新/舊樹比較差異
  • 4、更新差異對應真實DOM
  • 5、區域性進行重繪