以前面試過一些大廠,面試官對react的生命週期的知識點問來問去,問的都不知道react仍是本身內心的那個react了嗎?在使用過程當中還要這麼多套路嗎?
首先看下官方給出React16.4
生命週期圖
html
官方地址連接: 生命週期
看完這個圖,腦子有沒有清楚些?能夠看下面來加深印象react
我選擇的是使用
create-react-app
建立的項目,
你們也可使用
codesandbox
,
地址:
codesandbox.io/s/wizardly-…
成功建立項目啓動後開始實踐吧!
面試
插播廣告:是否是感受這個項目的綠色和以前的藍色不同了,可使用
npx create-react-app project
建立最新的項目試一試哦!
插播知識點:
getDerivedStateFromProps
會在調用 render 方法以前調用,而且在初始掛載及後續更新時都會被調用。它應返回一個對象來更新 state,若是返回 null 則不更新任何內容。
getSnapshotBeforeUpdate()
在最近一次渲染輸出(提交到 DOM 節點)以前調用。它使得組件能在發生更改以前從 DOM 中捕獲一些信息(例如,滾動位置)。今生命週期的任何返回值將做爲參數傳遞給componentDidUpdate()
。
bash每一個生命週期詳細介紹:app
根據理解的思路咱們分爲幾個假設來進行ui
測試這個流程,咱們把全部的生命週期羅列起來並打印全部的生命週期。this
而後發現報了一堆警告⚠️從上到下說下第一個spa
仍是這三個生命週期的警告⚠️因爲即將刪除這三個生命週期咱們在使用的過程當中須要在生命週期前加UNSAFE_
例如 :UNSAFE_componentWillMount
3d
爲了正常進行,咱們須要註釋先註釋掉getDerivedStateFromProps
getSnapshotBeforeUpdate
並給三個即將廢棄的生命週期加上UNSAFE_
在運行
constructor ->UNSAFE_componentWillMount-> render -> componentDidMount
constructor -> getDerivedStateFromProps -> render -> componentDidMount
測試流程:聲明一個newState默認值爲0
this.state = {
newState: 0
};
changeState = () => {
this.setState({
newState: 1
})
}
複製代碼
經過按鈕改變newState值
<button onClick={this.changeState}>修改state</button>複製代碼
建立一個組件Unmount
在App
中引用
//app組件
<Unmount newState={this.state.newState} />
class Unmount extends Component {
//此處用componentDidMount作表明,測試銷燬組件是否執行這個生命週期
componentDidMount() {
console.log("Unmount -> componentDidMount")
}
componentWillUnmount() {
console.log("Unmount -> componentWillUnmount")
}
UNSAFE_componentWillReceiveProps(nextProps) {
console.log("Unmount -> UNSAFE_componentWillReceiveProps", nextProps)
}
render() {
return (
<div>Unmount</div>
);
}
}
複製代碼
插播廣告:若是shouldComponentUpdate
的結果return false
則生命週期只執行
getDerivedStateFromProps -> shouldComponentUpdate ->❌(結束)
測試流程:當App
中state<2
時銷燬組件Unmount
//App組件
changeState = () => {
this.setState({
newState: this.state.newState + 1
})
}
{this.state.newState < 2 ? <Unmount /> : null}
複製代碼
根據實踐返回到咱們剛開始看到的聲明週期執行順序對比一下,有木有更清晰