【React】歸納篇(六)元件物件的生命週期 | 例項 | 虛擬DOM與DOM Diff演算法
阿新 • • 發佈:2018-12-09
元件物件的生命週期
元件物件的生命週期,指的是從元件物件產生到銷燬的過程。
如下圖所示:
生命週期的回撥函式:你定義了,你沒有呼叫,但是這個函式卻執行了。如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、區域性進行重繪