React錯(cuò)誤邊界Error Boundaries詳解
錯(cuò)誤邊界(Error Boundaries)
概述
- 部分 UI 的 JavaScript 錯(cuò)誤不應(yīng)該導(dǎo)致整個(gè)應(yīng)用崩潰,為了解決這個(gè)問題,React 16 引入了一個(gè)新的概念 —— 錯(cuò)誤邊界。
- 是React組件,可以捕獲并打印發(fā)生在其子組件樹任何位置的 JavaScript 錯(cuò)誤,并且,它會(huì)渲染出備用 UI。錯(cuò)誤邊界在渲染期間、生命周期方法和整個(gè)組件樹的構(gòu)造函數(shù)中捕獲錯(cuò)誤。
- class組件中才可以使用
- 錯(cuò)誤邊界僅可以捕獲其子組件的錯(cuò)誤
錯(cuò)誤邊界無法捕獲以下場(chǎng)景中的錯(cuò)誤
- 事件處理
- 異步代碼
- 服務(wù)端渲染
- 它自身拋出來的錯(cuò)誤(并非它的子組件)
渲染備用UI-static getDerivedStateFromError()
在class組件中使用 static getDerivedStateFromError() 可以渲染備用 UI
static getDerivedStateFromError(error){
// 更新 state 使下一次渲染能夠顯示降級(jí)后的 UI
return { hasError: true }
}
打印錯(cuò)誤信息-componentDidCatch()
- 在class組件中使用 cpmponentDidCatch(err,errorInfo) 可以打印錯(cuò)誤信息
- err:錯(cuò)誤信息; errorInfo:它存儲(chǔ)哪個(gè)組件引發(fā)了此錯(cuò)誤的componentStack跟蹤
componentDidCatch(error,errorInfo){
// 你同樣可以將錯(cuò)誤日志上報(bào)給服務(wù)器
logErrorToMyService(error, errorInfo)
}
打印錯(cuò)誤信息并渲染備用UI
class ErrorBoundary extends React.Component {
constructor(props){
super(props)
this.state = { hasError: false} //是否報(bào)錯(cuò)
}
static getDeriveStateFromError(error){
// 更新 state 使下一次渲染能夠顯示降級(jí)后的 UI
return { hasError: true }
}
componentDidCatch(error,errorInfo){
// 你同樣可以將錯(cuò)誤日志上報(bào)給服務(wù)器
logErrorToMyService(error, errorInfo)
}
render(){
if(this.state.hasError){
// 自定義降級(jí)后的 UI 并渲染
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
可以將錯(cuò)誤邊界封裝為一個(gè)組件進(jìn)行使用
<ErrorBoundary>
<MyWidget />
</ErrorBoundary>
//項(xiàng)目中可以用于包裹在路由外面
<ErrorBoundary>
<Suspense fallback={<div >Loading...</div>}>
...
<MyWidget />
</Suspense>
</ErrorBoundary>
錯(cuò)誤邊界的工作方式類似于 JavaScript 的 catch {},不同的地方在于錯(cuò)誤邊界只針對(duì) React 的class 組件。
錯(cuò)誤邊界應(yīng)該放置在哪?
可以選在最頂層的路由組件并為用戶展示一個(gè)錯(cuò)誤信息
未捕獲錯(cuò)誤(Uncaught Errors)的新行為
自 React 16 起,任何未被錯(cuò)誤邊界捕獲的錯(cuò)誤將會(huì)導(dǎo)致整個(gè) React 組件樹被卸載。
到此這篇關(guān)于React錯(cuò)誤邊界Error Boundaries詳解的文章就介紹到這了,更多相關(guān)React錯(cuò)誤邊界內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React通過ref獲取子組件的數(shù)據(jù)和方法
這篇文章主要介紹了React如何通過ref獲取子組件的數(shù)據(jù)和方法,文中有詳細(xì)的總結(jié)內(nèi)容和代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10
詳解React如何實(shí)現(xiàn)代碼分割Code Splitting
這篇文章主要為大家介紹了React如何實(shí)現(xiàn)代碼分割Code Splitting示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
淺談React?Refs?使用場(chǎng)景及核心要點(diǎn)
本文主要介紹了React?Refs?使用場(chǎng)景及核心要點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
React?TypeScript?應(yīng)用中便捷使用Redux?Toolkit方法詳解
這篇文章主要為大家介紹了React?TypeScript?應(yīng)用中便捷使用Redux?Toolkit方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
在?React?項(xiàng)目中全量使用?Hooks的方法
這篇文章主要介紹了在?React?項(xiàng)目中全量使用?Hooks,使用 Hooks 能為開發(fā)提升不少效率,但并不代表就要拋棄 Class Component,依舊還有很多場(chǎng)景我們還得用到它,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

