網站首頁 編程語言 正文
錯誤邊界(Error Boundaries)
概述
- 部分 UI 的 JavaScript 錯誤不應該導致整個應用崩潰,為了解決這個問題,React 16 引入了一個新的概念 —— 錯誤邊界。
- 是React組件,可以捕獲并打印發生在其子組件樹任何位置的 JavaScript 錯誤,并且,它會渲染出備用 UI。錯誤邊界在渲染期間、生命周期方法和整個組件樹的構造函數中捕獲錯誤。
- class組件中才可以使用
- 錯誤邊界僅可以捕獲其子組件的錯誤
錯誤邊界無法捕獲以下場景中的錯誤
- 事件處理
- 異步代碼
- 服務端渲染
- 它自身拋出來的錯誤(并非它的子組件)
渲染備用UI-static getDerivedStateFromError()
在class組件中使用 static getDerivedStateFromError() 可以渲染備用 UI
static getDerivedStateFromError(error){
// 更新 state 使下一次渲染能夠顯示降級后的 UI
return { hasError: true }
}
打印錯誤信息-componentDidCatch()
- 在class組件中使用 cpmponentDidCatch(err,errorInfo) 可以打印錯誤信息
- err:錯誤信息; errorInfo:它存儲哪個組件引發了此錯誤的componentStack跟蹤
componentDidCatch(error,errorInfo){
// 你同樣可以將錯誤日志上報給服務器
logErrorToMyService(error, errorInfo)
}
打印錯誤信息并渲染備用UI
class ErrorBoundary extends React.Component {
constructor(props){
super(props)
this.state = { hasError: false} //是否報錯
}
static getDeriveStateFromError(error){
// 更新 state 使下一次渲染能夠顯示降級后的 UI
return { hasError: true }
}
componentDidCatch(error,errorInfo){
// 你同樣可以將錯誤日志上報給服務器
logErrorToMyService(error, errorInfo)
}
render(){
if(this.state.hasError){
// 自定義降級后的 UI 并渲染
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
可以將錯誤邊界封裝為一個組件進行使用
<ErrorBoundary> <MyWidget /> </ErrorBoundary> //項目中可以用于包裹在路由外面 <ErrorBoundary> <Suspense fallback={<div >Loading...</div>}> ... <MyWidget /> </Suspense> </ErrorBoundary>
錯誤邊界的工作方式類似于 JavaScript 的 catch {},不同的地方在于錯誤邊界只針對 React 的class 組件。
錯誤邊界應該放置在哪?
可以選在最頂層的路由組件并為用戶展示一個錯誤信息
未捕獲錯誤(Uncaught Errors)的新行為
自 React 16 起,任何未被錯誤邊界捕獲的錯誤將會導致整個 React 組件樹被卸載。
原文鏈接:https://blog.csdn.net/xbczrz/article/details/128079580
相關推薦
- 2022-02-11 git clone報RPC failed; curl 18 transfer closed with
- 2022-04-27 Python?Pandas學習之基本數據操作詳解_python
- 2023-06-18 Python實現將內容轉為base64編碼與解碼_python
- 2022-07-08 ???????C語言實現單鏈表基本操作方法_C 語言
- 2022-08-03 C#后端接收form-data,創建實體類教程_C#教程
- 2022-02-16 IDEA 無法彈出模態框 HTTP 錯誤: 狀態代碼 404,net::ERR_HTTP_RESPO
- 2022-05-09 C#特性(Attribute)_C#教程
- 2022-06-25 Android開發實現圖片大小與質量壓縮及保存_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支