最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React 錯(cuò)誤邊界組件的處理

 更新時(shí)間:2021年04月12日 09:58:17   作者:xuxiaowei  
這篇文章主要介紹了React 錯(cuò)誤邊界組件的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

這是React16的內(nèi)容,并不是最新的技術(shù),但是用很少被討論,直到通過(guò)文檔發(fā)現(xiàn)其實(shí)也是很有用的一部分內(nèi)容,還是總結(jié)一下~

React中的未捕獲的 JS 錯(cuò)誤會(huì)導(dǎo)致整個(gè)應(yīng)用的崩潰,和整個(gè)組件樹(shù)的卸載。從 React16 開(kāi)始就是這樣。但是同時(shí)React也引入了一個(gè)新的概念——錯(cuò)誤邊界。

定義,是什么

錯(cuò)誤邊界仍然是一種組件,可以捕獲(打印或者其他方式)處理該組件的子組件樹(shù)任何位置的 JavaScript 錯(cuò)誤,并根據(jù)需要渲染出備用UI.

工作方式類(lèi)似于try-catch,但是錯(cuò)誤邊界只用于 React 組件。

只有class組件能夠成為錯(cuò)誤邊界組件。錯(cuò)誤邊界僅可以捕獲子組件的錯(cuò)誤,無(wú)法捕獲自身的錯(cuò)誤。

錯(cuò)誤邊界會(huì)在渲染期間,生命周期和整個(gè)組件樹(shù)的構(gòu)造函數(shù)中捕獲錯(cuò)誤。如果沒(méi)有錯(cuò)誤邊界處理,渲染的還是崩潰的子組件樹(shù),這顯然不是我們想要的。

通過(guò)一個(gè)例子來(lái)逐步演示要怎么用錯(cuò)誤邊界:

export default class ErrorTest extends Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <div>
        <BugCounter></BugCounter>
        <span>my name is dan</span>
      </div>
    );
  }
}

// Bug 報(bào)錯(cuò)組件
class BugCounter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0,
    };
  }
  click = () => {
    this.setState(({ counter }) => ({ counter: counter + 1 }));
  };
  render() {
    if (this.state.counter === 5) {
      throw new Error("crashed!");
    }
    return (
      <div>
        <h3 onClick={this.click}>{this.state.counter}</h3>
      </div>
    );
  }
}

上面代碼的渲染結(jié)果(忽略樣式):

點(diǎn)擊數(shù)字0,會(huì)逐步遞增。但是數(shù)字等于5的時(shí)候,組件會(huì)拋出一個(gè)Error:

Error會(huì)引起整個(gè)Demo的崩潰,連外部的<span>my name is dan</span>也顯示不出來(lái)了,這時(shí)還沒(méi)有添加錯(cuò)誤邊界。

生產(chǎn)模式下,會(huì)直接白屏,并在控制臺(tái)報(bào)錯(cuò):

getDerivedStateFromError & componentDidCatch

需要一個(gè)錯(cuò)誤邊界來(lái)處理這種崩潰。如何定義一個(gè)錯(cuò)誤邊界?

定義一個(gè)組件,并實(shí)現(xiàn)static getDerivedStateFromError() 或者componentDidCatch() 生命周期方法(可以都實(shí)現(xiàn)或者選擇其一)。這個(gè)組件就會(huì)變成一個(gè)錯(cuò)誤邊界。

關(guān)于這兩個(gè)生命周期函數(shù),可以通過(guò)鏈接查看,總結(jié)如下:

componentDidCatch(error, info)

error是拋出的錯(cuò)誤對(duì)象,而info則包含了組件引發(fā)錯(cuò)誤的棧信息。函數(shù)在提交階段被調(diào)用。是可以執(zhí)行副作用的。

static getDerivedStateFromError(error)

在子組件拋出錯(cuò)誤后調(diào)用,會(huì)將拋出的錯(cuò)誤作為參數(shù)。需要返回一個(gè)值,以更新state。該函數(shù)在渲染階段調(diào)用,不允許出現(xiàn)副作用。如果在捕獲錯(cuò)誤后需要執(zhí)行副作用操作,應(yīng)該在componentDidCatch中進(jìn)行。

制作錯(cuò)誤邊界組件

可以使用組合的方式,在要使用的組件上面添加一個(gè)錯(cuò)誤邊界組件包裹一層。該組件需要這些效果:

  • 捕獲子組件錯(cuò)誤,組件內(nèi)部記錄出錯(cuò)狀態(tài)
  • 在出錯(cuò)狀態(tài)下顯示備用UI,在正常狀態(tài)下顯示子組件

那么就可以像這樣:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(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ò)誤之后的副作用是自定義的,上傳服務(wù)器,或者用state記錄再顯示在頁(yè)面上:

componentDidCatch(error, errorInfo) {
  // Catch errors in any components below and re-render with error message
  this.setState({
    error: error,
    errorInfo: errorInfo
  })
}

捕獲處理

加上所有代碼,將有問(wèn)題的組件用錯(cuò)誤邊界的組件包裹起來(lái),看看結(jié)果:

import { Component } from "react";

export default class ErrorTest extends Component {
  render() {
    return (
      <div>
        <ErrorBoundary>
          <BugCounter></BugCounter>
        </ErrorBoundary>
        <span>my name is dan</span>
      </div>
    );
  }
}

// Bug 報(bào)錯(cuò)組件
class BugCounter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0,
    };
  }
  click = () => {
    this.setState(({ counter }) => ({ counter: counter + 1 }));
  };
  render() {
    if (this.state.counter === 5) {
      throw new Error("crashed!");
    }
    return (
      <div>
        <h3 onClick={this.click}>{this.state.counter}</h3>
      </div>
    );
  }
}

// 錯(cuò)誤邊界處理組件
class ErrorBoundary extends Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // 更新 state 使下一次渲染能夠顯示降級(jí)后的 UI
    return { hasError: true };
  }

  render() {
    if (this.state.hasError) {
      // 你可以自定義降級(jí)后的 UI 并渲染
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children;
  }
}

拋出異常在開(kāi)發(fā)模式下依然是報(bào)錯(cuò)的,但是在使用yarn build之后,再通過(guò)http-server掛起來(lái)之后,訪問(wèn)生產(chǎn)的頁(yè)面:

可以看到,雖然因?yàn)?code>throw error控制臺(tái)出錯(cuò),但是my name is dan的顯示并沒(méi)有被影響,也就是說(shuō),錯(cuò)誤邊界內(nèi)部的子組件錯(cuò)誤沒(méi)有影響到外部其他組件和元素。

作用范圍

錯(cuò)誤邊界用于處理子組件生命周期和渲染函數(shù)上的錯(cuò)誤,對(duì)于事件處理器,不會(huì)在渲染期間觸發(fā),對(duì)于事件處理器拋出的異常應(yīng)該用try catch

錯(cuò)誤邊界無(wú)法捕獲這些場(chǎng)景中的錯(cuò)誤:

  • 事件處理
  • 異步代碼
  • 服務(wù)端渲染
  • 錯(cuò)誤邊界自身拋出的錯(cuò)誤(非子組件)

關(guān)于錯(cuò)誤邊界,一個(gè) React的官方demo值得嘗試:

https://codepen.io/gaearon/pen/wqvxGa?editors=0010

參考:

https://zh-hans.reactjs.org/docs/error-boundaries.html

https://zh-hans.reactjs.org/docs/react-component.html

https://codepen.io/gaearon/pen/wqvxGa?editors=0010

到此這篇關(guān)于React 錯(cuò)誤邊界組件的處理的文章就介紹到這了,更多相關(guān)React 錯(cuò)誤邊界內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React native ListView 增加頂部下拉刷新和底下點(diǎn)擊刷新示例

    React native ListView 增加頂部下拉刷新和底下點(diǎn)擊刷新示例

    這篇文章主要介紹了React native ListView 增加頂部下拉刷新和底下點(diǎn)擊刷新示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • React Hooks核心原理深入分析講解

    React Hooks核心原理深入分析講解

    這篇文章主要介紹了react hooks實(shí)現(xiàn)原理,文中給大家介紹了useState dispatch 函數(shù)如何與其使用的 Function Component 進(jìn)行綁定,節(jié)后實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • React路由規(guī)則定義與聲明式導(dǎo)航及編程式導(dǎo)航分別介紹

    React路由規(guī)則定義與聲明式導(dǎo)航及編程式導(dǎo)航分別介紹

    這篇文章主要介紹了React路由規(guī)則的定義、聲明式導(dǎo)航、編程式導(dǎo)航,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • React中setState使用原理解析

    React中setState使用原理解析

    這篇文章主要介紹了React中的setState使用細(xì)節(jié)和原理解析,主要包括使用setstate的原因及基本用法,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • 利用React Router4實(shí)現(xiàn)的服務(wù)端直出渲染(SSR)

    利用React Router4實(shí)現(xiàn)的服務(wù)端直出渲染(SSR)

    這篇文章主要介紹了利用React Router4實(shí)現(xiàn)的服務(wù)端直出渲染(SSR),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • React中styled-components的使用

    React中styled-components的使用

    styled-components 樣式化組件,主要作用是它可以編寫(xiě)實(shí)際的CSS代碼來(lái)設(shè)計(jì)組件樣式,本文主要介紹了React中styled-components的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • React中useEffect與生命周期鉤子函數(shù)的對(duì)應(yīng)關(guān)系說(shuō)明

    React中useEffect與生命周期鉤子函數(shù)的對(duì)應(yīng)關(guān)系說(shuō)明

    這篇文章主要介紹了React中useEffect與生命周期鉤子函數(shù)的對(duì)應(yīng)關(guān)系說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React Native設(shè)備信息查看調(diào)試詳解

    React Native設(shè)備信息查看調(diào)試詳解

    這篇文章主要為大家介紹了React Native設(shè)備信息查看調(diào)試詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • react-native彈窗封裝的方法

    react-native彈窗封裝的方法

    這篇文章主要為大家詳細(xì)介紹了react-native彈窗封裝的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 如何解決React官方腳手架不支持Less的問(wèn)題(小結(jié))

    如何解決React官方腳手架不支持Less的問(wèn)題(小結(jié))

    這篇文章主要介紹了如何解決React官方腳手架不支持Less的問(wèn)題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

商都县| 孟州市| 龙陵县| 山阴县| 中阳县| 根河市| 宜昌市| 高陵县| 耒阳市| 齐齐哈尔市| 南通市| 西乌珠穆沁旗| 柳河县| 手游| 威信县| 海口市| 北海市| 吴忠市| 涟源市| 景德镇市| 白朗县| 潞西市| 资源县| 金乡县| 垣曲县| 禹州市| 黎城县| 黑龙江省| 武城县| 无极县| 日照市| 台东市| 绥德县| 进贤县| 阿拉善右旗| 太仓市| 蒙自县| 叶城县| 高安市| 天门市| 安吉县|