FE 讀書會(4-3):React Lifecycle
React Component Lifecycle
Component 的 lifecycle 如下:
- 建立 component
- 更新 component
- 刪除 component
建立 Component
建立 Component 的執行順序如下:
- constructor();
- componentWillMount();
- render();
- componentDidMount();
更新 Component
更新 Component 的執行順序如下:
- componentWillUpdate();
- render();
- componentDidUpdate();
刪除 Component
- componentWillUnmount();
讓我們看看 code
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>My Component</title>
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<script>
//設計組件類別
class MyHead extends React.Component
{
render(){
return React.createElement("H" + this.props.level, null, "Hello World");
}
}
class MyHeadList extends React.Component{
constructor(props){
super(props);
this.state={maxLevel:props.start};
}
componentWillMount(){
this.intervalId=window.setInterval(()=>{
//this.setState({maxLevel:6});
this.setState((currentState, currentProps)=>{
if(currentState.maxLevel > currentProps.end){
return currentState;
}else{
return {maxLevel: currentState.maxLevel + 1};
}
});
}, 1000);
}
componentWillUnmount(){
window.clearInterval(intervalId);
}
render(){
let heads = [];
let head;
for(let i = 0; i<this.state.maxLevel;i++){
head = React.createElement(MyHead, {level:(i + 1)});
heads.push(head);
}
return React.createElement("div", null, heads);
}
}
window.addEventListener("load", ()=>{
//1. 建立自訂的React組件實體
let myHeadList = React.createElement(MyHeadList, {start:2, end:5});
//2. 將建立好的React組件實體畫到容器中
ReactDOM.render(myHeadList, document.body);
})
</script>
</head>
</html>
這次的 Sample 跟前面一樣,只是將 setIntervel
搬到 componentWillMount
中,會是比較好的流程。
同時,將 window.setInterval
用物件存起來,並於 componentWillUnmount
中用 window.clearInterval
釋放。
小結
回顧上面我們知道 React Component 中的生命週期,並使用這些特性,將前一個 Sample 的
window.setInterval
搬到componentWillMount
中初始化,並於componentWillUnmount
中釋放。
Refernece
Author Leefu Chen
LastMod 2018-05-07