欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React之錯(cuò)誤邊界 Error Boundaries示例詳解

 更新時(shí)間:2022年10月24日 14:44:42   作者:三年沒洗澡  
這篇文章主要為大家介紹了React之錯(cuò)誤邊界Error Boundaries示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

過去,組件內(nèi)的代碼異常會(huì)導(dǎo)致 React 的內(nèi)部狀態(tài)被破壞,產(chǎn)生可能無法追蹤的錯(cuò)誤。但 React 并沒有提供一種優(yōu)雅處理這些錯(cuò)誤的方式,也無法從錯(cuò)誤中恢復(fù)。

默認(rèn)情況下,若一個(gè)組件在渲染期間(render)發(fā)生錯(cuò)誤,會(huì)導(dǎo)致整個(gè)組件樹全部被卸載,這當(dāng)然不是我們期望的結(jié)果。

部分組件的錯(cuò)誤不應(yīng)該導(dǎo)致整個(gè)應(yīng)用崩潰。為了解決這個(gè)問題,React 16 引入了一個(gè)新的概念 —— 錯(cuò)誤邊界

錯(cuò)誤邊界是一種 React 組件,這種組件可以捕獲發(fā)生在其子組件樹任何位置的異常,并打印這些錯(cuò)誤,同時(shí)展示降級(jí) UI,而并不會(huì)渲染那些發(fā)生崩潰的子組件樹。

注意

  • 錯(cuò)誤邊界目前只在 Class Component 中實(shí)現(xiàn)了,沒有在 hooks 中實(shí)現(xiàn)(因?yàn)镋rror Boundaries的實(shí)現(xiàn)借助了this.setState可以傳遞callback的特性,useState無法傳入回調(diào),所以無法完全對(duì)標(biāo));
  • 錯(cuò)誤邊界 無法捕獲 以下四種場(chǎng)景中產(chǎn)生的錯(cuò)誤:
    • 事件處理函數(shù)(因?yàn)?Error Boundaries 實(shí)現(xiàn)的本質(zhì)是觸發(fā)更新,但是事件處理函數(shù)不在render或者commit階段,所以無法進(jìn)行捕獲,如果你需要在事件處理器內(nèi)部捕獲錯(cuò)誤,可以使用原生的 try / catch 語句 了解更多
    • 異步代碼(例如 setTimeout 或 requestAnimationFrame 回調(diào)函數(shù))
    • 服務(wù)端渲染(因?yàn)橛|發(fā)更新只能在客戶端進(jìn)行,不能在serve端進(jìn)行)
    • 它自身拋出來的錯(cuò)誤(因?yàn)殄e(cuò)誤拋出要向父節(jié)點(diǎn)冒泡尋找 Error Boundaries 處理,無法處理自身產(chǎn)生的錯(cuò)誤)

實(shí)現(xiàn)

React中提供了兩個(gè)與錯(cuò)誤處理相關(guān)的api:

  • getderivedstatefromerror:靜態(tài)方法,當(dāng)錯(cuò)誤發(fā)生后,提供一個(gè)機(jī)會(huì)渲染 Fallback UI
  • componentDidCatch:組件實(shí)例方法,當(dāng)錯(cuò)誤發(fā)生后,提供一個(gè)機(jī)會(huì)記錄錯(cuò)誤信息

如果一個(gè) class 組件中定義了 getDerivedStateFromError() 或 componentDidCatch() 這兩個(gè)生命周期方法中的任意一個(gè)(或兩個(gè))時(shí),那么它就變成一個(gè)錯(cuò)誤邊界。當(dāng)拋出錯(cuò)誤后,請(qǐng)使用 getDerivedStateFromError() 渲染備用 UI ,使用 componentDidCatch() 打印錯(cuò)誤信息。

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      hasError: false,
    };
  }
  getDerivedStateFromError(error) {
    // 更新 state 使下一次渲染能夠顯示降級(jí)后的 UI
    return { hasError: true };
  }
  componentDidCatch(error, errorInfo) {
    // 你同樣可以將錯(cuò)誤日志上報(bào)給服務(wù)器
    logErrorToService(error, errorInfo);
  }
  render() {
    if (this.state.hasError) {
      // 你可以自定義降級(jí)后的 UI 并渲染
      return <h1>wrong message</h1>;
    }
    return this.props.children;
  }
}
export default ErrorBoundary;

然后你可以將它作為一個(gè)常規(guī)組件去使用:

<ErrorBoundary>
  <A />
  <B />
  <C />
</ErrorBoundary>

錯(cuò)誤邊界的工作方式類似于原生的 catch {},不同的地方在于,錯(cuò)誤邊界只針對(duì) React 組件。并且只有 class 組件才可以成為錯(cuò)誤邊界組件。大多數(shù)情況下, 你只需要聲明一次錯(cuò)誤邊界組件, 并在整個(gè)應(yīng)用中使用它。

錯(cuò)誤邊界應(yīng)該放置在哪?

錯(cuò)誤邊界的粒度由你來決定,可以將其包裝在最頂層的路由組件中,并為用戶展示一個(gè) “xxx” 的錯(cuò)誤信息,就像服務(wù)端框架經(jīng)常處理崩潰一樣。也可以將單獨(dú)的組件包裝在錯(cuò)誤邊界,從而保護(hù)其它組件不會(huì)崩潰。(例如,F(xiàn)acebook Messenger 將側(cè)邊欄、信息面板、聊天記錄以及信息輸入框包裝在單獨(dú)的錯(cuò)誤邊界中。如果其中的某些 UI 組件崩潰,其余部分仍然能夠交互。)

未捕獲錯(cuò)誤(Uncaught Errors)該如何處理?

自 React 16 起,任何未被錯(cuò)誤邊界捕獲的錯(cuò)誤將會(huì)導(dǎo)致整個(gè) React 組件樹被卸載。

在某些場(chǎng)景下,把一個(gè)錯(cuò)誤的 UI 留在那,比完全移除它要更糟糕。比如在類似 Messenger 的產(chǎn)品中,把一個(gè)異常的 UI 展示給用戶,可能會(huì)導(dǎo)致用戶把錯(cuò)誤信息發(fā)給別人。同樣,對(duì)于支付類場(chǎng)景而言,與其顯示錯(cuò)誤的支付金額,不如直接讓頁(yè)面白屏。

(所以,錯(cuò)誤邊界的使用難點(diǎn)在于尋找合適的時(shí)機(jī),知道在什么時(shí)候該用,什么時(shí)候不該用,這是一個(gè)充滿哲學(xué)的問題)

注意:自 React 15 的命名更改

React 15 中有一個(gè)支持有限的錯(cuò)誤邊界方法 unstable_handleError。這個(gè)方法不再起作用,自 React 16 起你需要在代碼中將其修改為 componentDidCatch。

以上就是React之錯(cuò)誤邊界 Error Boundaries示例詳解的詳細(xì)內(nèi)容,更多關(guān)于React 錯(cuò)誤邊界的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在React框架中實(shí)現(xiàn)一些AngularJS中ng指令的例子

    在React框架中實(shí)現(xiàn)一些AngularJS中ng指令的例子

    這篇文章主要介紹了在JavaScript的React框架中實(shí)現(xiàn)一些AngularJS指令的例子,React使用Virtual DOM因而與普通的js框架有些不同,需要的朋友可以參考下
    2016-03-03
  • React中使用Axios發(fā)起POST請(qǐng)求提交文件方式

    React中使用Axios發(fā)起POST請(qǐng)求提交文件方式

    這篇文章主要介紹了React中使用Axios發(fā)起POST請(qǐng)求提交文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • React競(jìng)態(tài)條件Race Condition實(shí)例詳解

    React競(jìng)態(tài)條件Race Condition實(shí)例詳解

    這篇文章主要為大家介紹了React競(jìng)態(tài)條件Race Condition實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React Native Popup實(shí)現(xiàn)示例

    React Native Popup實(shí)現(xiàn)示例

    本文主要介紹了React Native Popup實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • useState?解決文本框無法輸入的問題詳解

    useState?解決文本框無法輸入的問題詳解

    這篇文章主要為大家介紹了useState?解決文本框無法輸入的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • React Router v4 入坑指南(小結(jié))

    React Router v4 入坑指南(小結(jié))

    這篇文章主要介紹了React Router v4 入坑指南(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • TS裝飾器bindThis優(yōu)雅實(shí)現(xiàn)React類組件中this綁定

    TS裝飾器bindThis優(yōu)雅實(shí)現(xiàn)React類組件中this綁定

    這篇文章主要為大家介紹了TS裝飾器bindThis優(yōu)雅實(shí)現(xiàn)React類組件中this綁定,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 實(shí)例講解React 組件生命周期

    實(shí)例講解React 組件生命周期

    這篇文章主要介紹了React 組件生命周期的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • React中使用UEditor百度富文本的方法

    React中使用UEditor百度富文本的方法

    這篇文章主要介紹了React中使用UEditor的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux

    詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux

    這篇文章主要介紹了詳解如何優(yōu)雅地在React項(xiàng)目中使用Redux,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12

最新評(píng)論