React 基礎:組件異常捕獲——錯誤邊界


React 基礎:組件異常捕獲——錯誤邊界

前言

近年前端技術層出不窮,React 也是程序員間討論最多的 Javascript 框架之一。借這個機會開始學習 React,並把筆記作為 React 基礎教程系列(參考 React 官網)。

因為屬於入門,不太適合對 React 有經驗的同學,但希望到此的同學多少都有所收穫。

概要

官網說明:

部分 UI 的 JavaScript 錯誤不應該導致整個應用崩潰,為了解決這個問題,React 16 引入了一個新的概念 —— 錯誤邊界。

錯誤邊界也是 React 組件,並且有兩個作用:

  1. 捕獲子組件中的錯誤
  2. 當發生問題時,渲染備用 UI

示例

下面示範"錯誤邊界"的用法:

模擬一個組件出現錯誤,強制 throw 拋出 Error 對象:

React 基礎:組件異常捕獲——錯誤邊界

父組件 Clock 的 JSX 中,引用子組件 Error :

React 基礎:組件異常捕獲——錯誤邊界

實現 getDerivedStateFromError 方法,將 error 交給 state 狀態對象:

React 基礎:組件異常捕獲——錯誤邊界

當 state 更新後,將重新觸發 render 方法,從而執行到 if 邏輯,渲染出降級的 UI 內容:

React 基礎:組件異常捕獲——錯誤邊界

當然也可以通過 componentDidCatch 方法顯示更多的錯誤信息:

React 基礎:組件異常捕獲——錯誤邊界

頁面 HTML 效果圖:

React 基礎:組件異常捕獲——錯誤邊界

父組件 Clock 是個定時器組件,而子組件 Error 指定時間後會拋出錯誤,最後被 Clock 組件接收到,渲染降級 UI。

相關 API

  • static getDerivedStateFromError()
  • componentDidCatch()
  • getDerivedStateFromError() 會處理有關 error 信息,然後 return 的結果交給組件的狀態對象 state 。

    錯誤信息示意:

    React 基礎:組件異常捕獲——錯誤邊界

    componentDidCatch() 具備更多錯誤的信息,就如官方建議,可以把錯誤日誌上報給服務器,以便排查問題。

    錯誤信息示意:

    React 基礎:組件異常捕獲——錯誤邊界


    React 基礎:組件異常捕獲——錯誤邊界

    總結

    以上就是關於 React 錯誤邊界中,getDerivedStateFromError 以及 componentDidCatch 用法示例。

    反問 Vue 是否有類似的方法呢?

    答案也是有的,你也可以在 Vue 對應的 API 章節中找到:

    React 基礎:組件異常捕獲——錯誤邊界

    React 基礎:組件異常捕獲——錯誤邊界

    errorHandler errorCaptured 分別可以在全局範圍和組件內使用,用於異常的捕獲。(我居然一次都沒用過,幸好 React 把這塊概念單獨領了出來,讓我再次溫習了下)

    為了更好的閱讀體驗,可以在文章底下的“瞭解更多”中查看原文


    分享到:


    相關文章: