Docker 的優點
838
2022-05-30
React Native中的component跟Android中的activity,fragment等一樣,存在生命周期,下面先給出component的生命周期圖
getDefaultProps
執行過一次后,被創建的類會有緩存,映射的值會存在this.props,前提是這個prop不是父組件指定的
這個方法在對象被創建之前執行,因此不能在方法內調用this.props?,另外,注意任何getDefaultProps()返回的對象在實例***享,不是復制
getInitialState
控件加載之前執行,返回值會被用于state的初始化值
componentWillMount
執行一次,在初始化render之前執行,如果在這個方法內調用setState,render()知道state發生變化,并且只執行一次
render
render的時候會調用render()會被調用
調用render()方法時,首先檢查this.props和this.state返回一個子元素,子元素可以是DOM組件或者其他自定義復合控件的虛擬實現
如果不想渲染可以返回null或者false,這種場景下,React渲染一個
render()方法是很純凈的,這就意味著不要在這個方法里初始化組件的state,每次執行時返回相同的值,不會讀寫DOM或者與服務器交互,如果必須如服務器交互,在componentDidMount()方法中實現或者其他生命周期的方法中實現,保持render()方法純凈使得服務器更準確,組件更簡單
componentDidMount
在初始化render之后只執行一次,在這個方法內,可以訪問任何組件,componentDidMount()方法中的子組件在父組件之前執行
從這個函數開始,就可以和 JS 其他框架交互了,例如設置計時 setTimeout 或者 setInterval,或者發起網絡請求
shouldComponentUpdate
這個方法在初始化render時不會執行,當props或者state發生變化時執行,并且是在render之前,當新的props或者state不需要更新組件時,返回false
當shouldComponentUpdate方法返回false時,講不會執行render()方法,componentWillUpdate和componentDidUpdate方法也不會被調用
默認情況下,shouldComponentUpdate方法返回true防止state快速變化時的問題,但是如果·state不變,props只讀,可以直接覆蓋shouldComponentUpdate用于比較props和state的變化,決定UI是否更新,當組件比較多時,使用這個方法能有效提高應用性能
componentWillUpdate
當props和state發生變化時執行,并且在render方法之前執行,當然初始化render時不執行該方法,需要特別注意的是,在這個函數里面,你就不能使用this.setState來修改狀態。這個函數調用之后,就會把nextProps和nextState分別設置到this.props和this.state中。緊接著這個函數,就會調用render()來更新界面了
componentDidUpdate
組件更新結束之后執行,在初始化render時不執行
componentWillReceiveProps
當props發生變化時執行,初始化render時不執行,在這個回調函數里面,你可以根據屬性的變化,通過調用this.setState()來更新你的組件狀態,舊的屬性還是可以通過this.props來獲取,這里調用更新狀態是安全的,并不會觸發額外的render調用
componentWillUnmount
void componentWillUnmount()
當組件要被從界面上移除的時候,就會調用componentWillUnmount(),在這個函數中,可以做一些組件相關的清理工作,例如取消計時器、網絡請求等
總結
React Native的生命周期就介紹完了,其中最上面的虛線框和右下角的虛線框的方法一定會執行,左下角的方法根據props?state是否變化去執行,其中建議只有在componentWillMount,componentDidMount,componentWillReceiveProps方法中可以修改state值
英文地址:https://facebook.github.io/react/docs/component-specs.html#lifecycle-methods
本文轉載自異步社區
React
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。