您好,登錄后才能下訂單哦!
小編這次要給大家分享的是如何使用React生命周期,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
React生命周期
生命周期的狀態
組件的生命周期可分成三個狀態:
生命周期介紹
componentDidMount :
在第一次渲染后調用,只在客戶端。之后組件已經生成了對應的DOM結構,可以通過this.getDOMNode()來進行訪問。 如果你想和其他JavaScript框架一起使用,可以在這個方法中調用setTimeout, setInterval或者發送AJAX請求等操作(防止異步操作阻塞UI)。
componentWillReceiveProps
在組件接收到一個新的 prop (更新后)時被調用。這個方法在初始化render時不會被調用。
shouldComponentUpdate
返回一個布爾值。在組件接收到新的props或者state時被調用。在初始化時或者使用forceUpdate時不被調用。
可以在你確認不需要更新組件時使用。
componentWillUpdate
在組件接收到新的props或者state但還沒有render時被調用。在初始化時不會被調用。
componentDidUpdate
在組件完成更新后立即調用。在初始化時不會被調用。
componentWillUnmount
在組件從 DOM 中移除之前立刻被調用。
代碼示意
class Content extends React.Component { componentWillMount() { console.log('Component WILL MOUNT!') } componentDidMount() { console.log('Component DID MOUNT!') } componentWillReceiveProps(newProps) { console.log('Component WILL RECEIVE PROPS!') } shouldComponentUpdate(newProps, newState) { return true; } componentWillUpdate(nextProps, nextState) { console.log('Component WILL UPDATE!'); } componentDidUpdate(prevProps, prevState) { console.log('Component DID UPDATE!') } componentWillUnmount() { console.log('Component WILL UNMOUNT!') }
安裝
在創建組件的實例并將其插入DOM時,將按以下順序調用這些方法:
constructor()
React組件的構造函數在安裝之前被調用。在實現React.Component子類的構造函數時,應該super(props)在任何其他語句之前調用。否則,this.props將在構造函數中未定義,這可能導致錯誤。
通常,在React中,構造函數僅用于兩個目的:
通過分配對象來初始化本地狀態this.state。
將事件處理程序方法綁定到實例。
不應該打電話setState()給constructor()。相反,如果您的組件需要使用本地狀態,請直接在構造函數中指定初始狀態this.state。
構造函數是his.state直接分配的唯一位置。在所有其他方法中,需要使用this.setState()。
static getDerivedStateFromProps()
getDerivedStateFromProps在調用render方法之前調用,無論是在初始安裝還是后續更新。它應該返回一個更新狀態的對象,或者返回null以不更新任何狀態。
render()
render()方法是類組件中唯一必需的方法。
調用時,它應檢查this.props并this.state返回以下類型之一:
該render()函數應該無狀態的,這意味著它不會修改組件狀態,每次調用時都返回相同的結果,并且它不直接與瀏覽器交互。
如果您需要與瀏覽器進行交互,請執行componentDidMount()或其他生命周期方法。保持render()純粹使組件更容易思考。
如果shouldComponentUpdate()返回false,則render()不會被調用
componentDidMount()
這些方法被認為是遺留的,應該在新代碼中避免它們:
UNSAFE_componentWillMount()
更新
props or state 的更改可能導致更新。重新渲染組件時,將按以下順序調用這些方法:
static getDerivedStateFromProps()
render()
getSnapshotBeforeUpdate()
getSnapshotBeforeUpdate(prevProps, prevState)
getSnapshotBeforeUpdate()在最近呈現的輸出被提交到例如DOM之前調用。它使得組件可以在可能更改之前從DOM捕獲一些信息(例如滾動位置)。此生命周期返回的任何值都將作為參數傳遞給componentDidUpdate()。
此用例并不常見,但它可能出現在需要以特殊方式處理滾動位置的聊天線程等UI中。
官網的例子
class ScrollingList extends React.Component { constructor(props) { super(props); this.listRef = React.createRef(); } getSnapshotBeforeUpdate(prevProps, prevState) { // Are we adding new items to the list? // Capture the scroll position so we can adjust scroll later. if (prevProps.list.length < this.props.list.length) { const list = this.listRef.current; return list.scrollHeight - list.scrollTop; } return null; } componentDidUpdate(prevProps, prevState, snapshot) { // If we have a snapshot value, we've just added new items. // Adjust scroll so these new items don't push the old ones out of view. // (snapshot here is the value returned from getSnapshotBeforeUpdate) if (snapshot !== null) { const list = this.listRef.current; list.scrollTop = list.scrollHeight - snapshot; } } render() { return ( <div ref={this.listRef}>{/* ...contents... */}</div> ); } }
componentDidUpdate()
componentDidUpdate()更新發生后立即調用。初始渲染不會調用此方法。
將此作為在更新組件時對DOM進行操作的機會。只要您將當前道具與之前的道具進行比較(例如,如果道具未更改,則可能不需要網絡請求),這也是進行網絡請求的好地方。
componentDidUpdate(prevProps) { // Typical usage (don't forget to compare props): if (this.props.userID !== prevProps.userID) { this.fetchData(this.props.userID); } }
componentDidUpdate()但要注意,必須在一個條件下被包裹就像上面的例子中,否則會導致無限循環。它還會導致額外的重新渲染,雖然用戶不可見,但會影響組件性能。
componentDidUpdate():如果shouldComponentUpdate()返回false,則不會被調用。
這些方法被認為是遺留的,您應該在新代碼中避免它們:
UNSAFE_componentWillUpdate()
UNSAFE_componentWillReceiveProps()
卸載
從DOM中刪除組件時調用此方法:
componentWillUnmount()
componentWillUnmount()在卸載和銷毀組件之前立即調用。在此方法中執行任何必要的清理,例如使計時器無效,取消網絡請求或清除在其中創建的任何訂閱componentDidMount()。
不應該調用setState(),componentWillUnmount()因為組件永遠不會被重新呈現。卸載組件實例后,將永遠不會再次安裝它。
錯誤處理
在渲染期間,生命周期方法或任何子組件的構造函數中發生錯誤時,將調用這些方法。
static getDerivedStateFromError()
static getDerivedStateFromError(error)
在后代組件拋出錯誤后調用此生命周期。它接收作為參數拋出的錯誤,并應返回值以更新狀態。
componentDidCatch()
componentDidCatch(error, info)
在后代組件拋出錯誤后調用此生命周期。它接收兩個參數:
error - 拋出的錯誤。
info- componentStack包含鍵的對象,其中包含有關哪個組件引發錯誤的信息。
如果發生錯誤,可以componentDidCatch()通過調用呈現回退UI setState,但在將來的版本中將不推薦使用。使用static getDerivedStateFromError()處理回退,而不是渲染。
componentDidCatch()在“提交”階段被調用,因此允許副作用。它應該用于記錄錯誤之類的事情:
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true }; } componentDidCatch(error, info) { // Example "componentStack": // in ComponentThatThrows (created by App) // in ErrorBoundary (created by App) // in div (created by App) // in App logComponentStackToMyService(info.componentStack); } render() { if (this.state.hasError) { // You can render any custom fallback UI return <h2>Something went wrong.</h2>; } return this.props.children; } }
看完這篇關于如何使用React生命周期的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。