react的生命週期大概分爲前端
當組件掛載到DOM樹上以後,props/state被修改會致使組件進行更新操做。更新過程會以此調用以下的生命週期函數:java
卸載過程只涉及一個函數componentWillUnmount,當React組件要從DOM樹上刪除前,會調用一次這個函數。這個函數常常用於去除componentDidMount函數帶來的反作用,例如清楚計時器、刪除componentDidMount中創造的非React元素。react
要修改state,只能使用this.setState(),不能使用this.state.value='myData' 相似方式設置state,一是不會驅動從新渲染,二是極可能被後面的操做替換,形成沒法預知的錯誤。此外,React利用狀態隊列來實現setState的異步更新,避免頻繁地重複更新state。當同時作了不少setState操做的時候,react會智能的合併成一個setState,當須要肯定的setState完成後的操做,可使用web
setState({}, () => {
// 在這裏進行state改變後的操做
})
複製代碼
setState的調用是有風險的,在某些生命週期函數中調用可能會無用甚至早恆循環調用致使崩潰。state的初始化通常在構造函數中實現;setState能夠在裝載過程的componentWillMount、componentDidMount中調用;setState能夠在更新過程當中的componentWillReceiveProps、componentDidUpdate中調用服務器
render是一個異步函數,render執行後並不會直接生成Dom,而是生成虛擬Dom節點(模擬HTML Dom節點的一個javaScript數據結構),什麼時候生成真實的DOM樹取決於react框架自己的計算。 參考 騰訊前端數據結構
static getDerivedStateFromProps(nextProps, prevState) {
//根據nextProps和prevState計算出預期的狀態改變,返回結果會被送給setState
}
複製代碼
全部被刪除的生命週期函數,目前還湊合着用,可是隻要用了,開發模式下會有紅色警告,在下一個大版本(也就是React v17)更新時會完全廢棄。框架
static getDerivedStateFromProps(nextProps, prevState) {
4. Updating state based on props
7. Fetching external data when props change
}
constructor() {
1. Initializing state
}
componentDidMount() {
2. Fetching external data
3. Adding event listeners (or subscriptions)
}
shouldComponentUpdate() {
}
render() {
}
getSnapshotBeforeUpdate(prevProps, prevState) {
8. Reading DOM properties before an update
}
componentDidUpdate(prevProps, prevState, snapshot) {
5. Invoking external callbacks
6. Side effects on props change
}
componentWillUnmount() {
}
// before
componentWillMount() {
// 1. Initializing state
// 2. Fetching external data
// 3. Adding event listeners (or subscriptions)
}
componentWillReceiveProps() {
// 4. Updating state based on props
// 6. Side effects on props change
// 7. Fetching external data when props change
}
componentWillUpdate(nextProps, nextState) {
// 5. Invoking external callbacks
// 8. Reading DOM properties before an update
}
複製代碼
參考 程墨dom