成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說你在React項目是如何捕獲錯誤的?

開發 前端
在react項目中去編寫組件內JavaScript代碼錯誤會導致 React 的內部狀態被破壞,導致整個應用崩潰,這是不應該出現的現象。

[[414977]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

錯誤在我們日常編寫代碼是非常常見的

舉個例子,在react項目中去編寫組件內JavaScript代碼錯誤會導致 React 的內部狀態被破壞,導致整個應用崩潰,這是不應該出現的現象

作為一個框架,react也有自身對于錯誤的處理的解決方案

二、如何做

為了解決出現的錯誤導致整個應用崩潰的問題,react16引用了「錯誤邊界」新的概念

錯誤邊界是一種 React 組件,這種組件可以捕獲發生在其子組件樹任何位置的 JavaScript 錯誤,并打印這些錯誤,同時展示降級 UI,而并不會渲染那些發生崩潰的子組件樹

錯誤邊界在渲染期間、生命周期方法和整個組件樹的構造函數中捕獲錯誤

形成錯誤邊界組件的兩個條件:

  • 使用了 static getDerivedStateFromError()
  • 使用了 componentDidCatch()

拋出錯誤后,請使用 static getDerivedStateFromError() 渲染備用 UI ,使用 componentDidCatch() 打印錯誤信息,如下:

  1. class ErrorBoundary extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.state = { hasError: false }; 
  5.   } 
  6.  
  7.   static getDerivedStateFromError(error) { 
  8.     // 更新 state 使下一次渲染能夠顯示降級后的 UI 
  9.     return { hasError: true }; 
  10.   } 
  11.  
  12.   componentDidCatch(error, errorInfo) { 
  13.     // 你同樣可以將錯誤日志上報給服務器 
  14.     logErrorToMyService(error, errorInfo); 
  15.   } 
  16.  
  17.   render() { 
  18.     if (this.state.hasError) { 
  19.       // 你可以自定義降級后的 UI 并渲染 
  20.       return <h1>Something went wrong.</h1>; 
  21.     } 
  22.  
  23.     return this.props.children;  
  24.   } 

然后就可以把自身組件的作為錯誤邊界的子組件,如下:

  1. <ErrorBoundary> 
  2.   <MyWidget /> 
  3. </ErrorBoundary> 

下面這些情況無法捕獲到異常:

  • 事件處理
  • 異步代碼
  • 服務端渲染
  • 自身拋出來的錯誤

在react 16版本之后,會把渲染期間發生的所有錯誤打印到控制臺

除了錯誤信息和 JavaScript 棧外,React 16 還提供了組件棧追蹤。現在你可以準確地查看發生在組件樹內的錯誤信息:

可以看到在錯誤信息下方文字中存在一個組件棧,便于我們追蹤錯誤

對于錯誤邊界無法捕獲的異常,如事件處理過程中發生問題并不會捕獲到,是因為其不會在渲染期間觸發,并不會導致渲染時候問題

這種情況可以使用js的try...catch...語法,如下:

  1. class MyComponent extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.state = { error: null }; 
  5.     this.handleClick = this.handleClick.bind(this); 
  6.   } 
  7.  
  8.   handleClick() { 
  9.     try { 
  10.       // 執行操作,如有錯誤則會拋出 
  11.     } catch (error) { 
  12.       this.setState({ error }); 
  13.     } 
  14.   } 
  15.  
  16.   render() { 
  17.     if (this.state.error) { 
  18.       return <h1>Caught an error.</h1> 
  19.     } 
  20.     return <button onClick={this.handleClick}>Click Me</button> 
  21.   } 

除此之外還可以通過監聽onerror事件

  1. window.addEventListener('error'function(event) { ... }) 

參考文獻

 

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

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2023-12-19 09:24:22

LinuxBIOSUEFI

2021-09-14 07:06:13

React項目TypeScript

2025-04-01 00:00:00

項目CRUD單例模式

2021-06-29 09:47:34

ReactSetState機制

2021-11-25 10:18:42

RESTfulJava互聯網

2021-08-09 07:47:40

Git面試版本

2021-06-30 07:19:36

React事件機制

2021-05-08 08:35:33

Webpack前端性能

2025-02-26 12:19:52

2025-03-10 11:48:22

項目服務設計

2015-08-13 10:29:12

面試面試官

2025-02-12 08:43:06

2021-08-02 08:34:20

React性能優化

2020-12-01 08:47:36

Java異常開發

2020-06-12 15:50:56

options前端服務器

2024-05-11 15:11:44

系統軟件部署

2021-09-15 07:56:32

TypeScriptVue項目

2021-11-02 22:04:58

模式

2021-07-07 08:36:45

React應用場景

2020-08-17 07:40:19

消息隊列
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧日韩在线观看 | 男女搞网站 | 五月婷婷在线播放 | 日本不卡免费新一二三区 | 久久精品一 | 亚洲综合大片69999 | 超碰97免费在线 | 在线播放国产一区二区三区 | 久久国产精品免费视频 | 麻豆91精品91久久久 | 亚洲高清在线 | 亚洲精久 | 成人在线免费视频观看 | 羞羞的视频免费在线观看 | heyzo在线 | 最新日韩在线 | 色播av | 黄在线| 精品视频成人 | 一区二区在线不卡 | 久久久久久国产精品三区 | 一区二区日本 | 中文天堂网| 欧美成人激情视频 | www312aⅴ欧美在线看 | 欧美国产视频 | 91精品国产麻豆 | 男人天堂国产 | 一区二区三区中文字幕 | 精品亚洲一区二区 | 二区av | 国产成人99久久亚洲综合精品 | 日韩精品色网 | 欧美国产日韩在线观看成人 | 中国三级黄色录像 | 九色国产 | 色播99| 久久综合一区二区 | 天天操人人干 | www.日本国产 | 在线成人av |