
- ReactJS 教程
- ReactJS - 首頁
- ReactJS - 簡介
- ReactJS - 路線圖
- ReactJS - 安裝
- ReactJS - 特性
- ReactJS - 優點與缺點
- ReactJS - 架構
- ReactJS - 建立 React 應用
- ReactJS - JSX
- ReactJS - 元件
- ReactJS - 巢狀元件
- ReactJS - 使用新建立的元件
- ReactJS - 元件集合
- ReactJS - 樣式
- ReactJS - 屬性 (props)
- ReactJS - 使用屬性建立元件
- ReactJS - props 校驗
- ReactJS - 建構函式
- ReactJS - 元件生命週期
- ReactJS - 事件管理
- ReactJS - 建立一個事件感知元件
- ReactJS - 在 Expense Manager 應用中引入事件
- ReactJS - 狀態管理
- ReactJS - 狀態管理 API
- ReactJS - 無狀態元件
- ReactJS - 使用 React Hooks 進行狀態管理
- ReactJS - 使用 React Hooks 進行元件生命週期管理
- ReactJS - 佈局元件
- ReactJS - 分頁
- ReactJS - Material UI
- ReactJS - Http 客戶端程式設計
- ReactJS - 表單程式設計
- ReactJS - 受控元件
- ReactJS - 非受控元件
- ReactJS - Formik
- ReactJS - 條件渲染
- ReactJS - 列表
- ReactJS - Keys
- ReactJS - 路由
- ReactJS - Redux
- ReactJS - 動畫
- ReactJS - Bootstrap
- ReactJS - Map
- ReactJS - 表格
- ReactJS - 使用 Flux 管理狀態
- ReactJS - 測試
- ReactJS - CLI 命令
- ReactJS - 構建和部署
- ReactJS - 示例
- Hooks
- ReactJS - Hooks 簡介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定義 Hooks
- ReactJS 高階
- ReactJS - 可訪問性
- ReactJS - 程式碼分割
- ReactJS - Context
- ReactJS - 錯誤邊界
- ReactJS - 轉發 Refs
- ReactJS - Fragments
- ReactJS - 高階元件
- ReactJS - 與其他庫整合
- ReactJS - 效能最佳化
- ReactJS - Profiler API
- ReactJS - Portals
- ReactJS - 無 ES6 ECMAScript 的 React
- ReactJS - 無 JSX 的 React
- ReactJS - Reconciliation (協調)
- ReactJS - Refs 和 DOM
- ReactJS - Render Props
- ReactJS - 靜態型別檢查
- ReactJS - Strict Mode (嚴格模式)
- ReactJS - Web Components
- 其他概念
- ReactJS - 日期選擇器
- ReactJS - Helmet
- ReactJS - 內聯樣式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 走馬燈
- ReactJS - 圖示
- ReactJS - 表單元件
- ReactJS - 參考 API
- ReactJS 有用資源
- ReactJS - 快速指南
- ReactJS - 有用資源
- ReactJS - 討論
ReactJS - 錯誤邊界
通常,捕獲錯誤並在不影響應用程式 UI 的情況下處理錯誤是一項非常具有挑戰性的任務。React 引入了一個名為錯誤邊界的概念,用於在 UI 渲染過程中捕獲錯誤,在後臺處理它,並在前端應用程式中顯示備用 UI。這不會影響 UI 應用程式,因為它使用替代 UI(例如警告訊息)而不是損壞的頁面來處理。
讓我們在本節中學習什麼是錯誤邊界以及如何在我們的應用程式中應用它。
錯誤邊界的概念
錯誤邊界是具有特殊功能的普通 React 元件,可以捕獲元件樹中任何位置發生的任何錯誤。捕獲到的錯誤可以在處理過程中記錄,然後可以向用戶顯示指定錯誤的替代使用者介面。
透過實現兩個函式,可以將基於普通 React 類的元件升級為支援錯誤邊界的元件。
static getDerivedStateFromError() − 這是一個靜態函式,當應用程式中發生錯誤時將被呼叫。
static getDerivedStateFromError(error) { return { hasError: true }; }
這裡,hasError 是一個自定義狀態變數,指定應用程式存在一些錯誤,可以在後續渲染中使用它來顯示備用 UI 而不是普通 UI。
componentDidCatch() − 當元件樹中發生錯誤時,將使用錯誤資訊呼叫此元件生命週期事件。
componentDidCatch(error, errorInfo) { // log the error in console or store it somewhere using a log service }
一旦元件升級為處理錯誤,它就可以像普通元件一樣在應用程式中的任何位置使用。讓我們考慮元件的名稱為 SimpleErrorBoundary,則其使用方法如下所示:
<SimpleErrorBoundary> <MyComponent /> </SimpleErrorBoundary>
這裡:
React 將捕獲 MyComponent 元件中發生的任何錯誤,並將其傳送到 SimpleErrorBoundary 元件以進行進一步處理。
React 不會捕獲所有錯誤,除了以下情況下發生的錯誤:
事件處理程式 − 事件處理程式是純 JavaScript 函式,可以使用 try/catch 並自行渲染備用 UI,可能不需要錯誤邊界提示。
非同步程式碼,如 setTimeout。
伺服器端渲染。錯誤邊界專門用於前端應用程式。
錯誤邊界元件本身發生的錯誤。
應用錯誤邊界
讓我們在本節中建立一個新的 React 應用程式來學習如何在其中應用錯誤邊界。
首先,使用以下命令建立一個新的 React 應用程式並啟動它。
create-react-app myapp cd myapp npm start
接下來,開啟 App.css (src/App.css) 並刪除所有 CSS 類。然後,建立一個簡單的元件 SimpleErrorBoundary (src/Components/SimpleErrorBoundary.js) 並渲染錯誤期間的備用 UI 或子元件,如下所示:
import React from "react"; class SimpleErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { return { hasError: true }; } componentDidCatch(error, errorInfo) { console.log(error); console.log(errorInfo); } render() { if (this.state.hasError) { return <h1>Please contact the administrator.</h1>; } return this.props.children; } } export default SimpleErrorBoundary;
這裡:
hasError 是一個初始化值為 false 的狀態變數。
getDerivedStateFromError 在發生錯誤時更新錯誤狀態。
componentDidCatch 將錯誤記錄到控制檯。
render 將根據應用程式中的錯誤渲染錯誤 UI 或子元件。
接下來,建立一個簡單的元件 Hello (src/Components/Hello.js) 並渲染一個簡單的文字訊息,如下所示:
import React from "react"; class Hello extends React.Component { constructor(props) { super(props) } render() { if(this.props.name == "error") { throw('Invoked error') } return ( <div>Hello, {this.props.name}</div> ); } } export default Hello;
這裡我們有:
使用 name props 顯示問候訊息。
如果給定的名稱為 error,則丟擲錯誤。
接下來,開啟 App 元件 (src/App.js),並使用 SimpleErrorBoundary 元件,如下所示:
import './App.css' import React from 'react'; import SimpleErrorBoundary from './Components/SimpleErrorBoundary' import Hello from './Components/Hello' function App() { return ( <div className="container"> <div style={{ padding: "10px" }}> <div> <SimpleErrorBoundary> <Hello name="error" /> </SimpleErrorBoundary> </div> </div> </div> ); } export default App;
這裡我們有:
從 React 包中匯入了 SimpleErrorBoundary 元件。
使用 SimpleErrorBoundary 元件,並將 error 作為 name props 的值。
最後,在瀏覽器中開啟應用程式並檢查最終結果。

在開發者工具中開啟控制檯,您將看到如下所示的錯誤資訊:
Invoked error SimpleErrorBoundary.js:17 { componentStack: '\n at Hello (https://:3000/static/js/bun…09:5)\n at div\n at div\n at div\n at App' }
總結
錯誤邊界是一個安全且有價值的元件,用於處理前端應用程式中意外發生的錯誤。如果沒有錯誤邊界,則很難隱藏錯誤並獲取有關發生錯誤的有價值的除錯資訊。