国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語(yǔ)言 - JavaScript - React - React 錯(cuò)誤邊界組件的處理

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

2022-02-28 16:23xuxiaowei React

這篇文章主要介紹了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.

工作方式類似于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ò)誤邊界:

  1. export default class ErrorTest extends Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.   } 
  5.   render() { 
  6.     return ( 
  7.       <div> 
  8.         <BugCounter></BugCounter> 
  9.         <span>my name is dan</span> 
  10.       </div> 
  11.     ); 
  12.   } 
  13.  
  14. // Bug 報(bào)錯(cuò)組件 
  15. class BugCounter extends Component { 
  16.   constructor(props) { 
  17.     super(props); 
  18.     this.state = { 
  19.       counter: 0, 
  20.     }; 
  21.   } 
  22.   click = () => { 
  23.     this.setState(({ counter }) => ({ counter: counter + 1 })); 
  24.   }; 
  25.   render() { 
  26.     if (this.state.counter === 5) { 
  27.       throw new Error("crashed!"); 
  28.     } 
  29.     return ( 
  30.       <div> 
  31.         <h3 onClick={this.click}>{this.state.counter}</h3> 
  32.       </div> 
  33.     ); 
  34.   } 

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

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

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

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

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

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

React 錯(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é)如下:

  1. componentDidCatch(error, info) 

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

  1. 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)下顯示子組件

那么就可以像這樣:

  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 使下一次渲染能夠顯示降級(jí)后的 UI 
  9.     return { hasError: true }; 
  10.   } 
  11.  
  12.   componentDidCatch(error, errorInfo) { 
  13.     // 你同樣可以將錯(cuò)誤日志上報(bào)給服務(wù)器 
  14.     logErrorToMyService(error, errorInfo); 
  15.   } 
  16.  
  17.   render() { 
  18.     if (this.state.hasError) { 
  19.       // 你可以自定義降級(jí)后的 UI 并渲染 
  20.       return <h1>Something went wrong.</h1>; 
  21.     } 
  22.  
  23.     return this.props.children;  
  24.   } 

捕獲到錯(cuò)誤之后的副作用是自定義的,上傳服務(wù)器,或者用state記錄再顯示在頁(yè)面上:

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

捕獲處理

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

  1. import { Component } from "react"
  2.  
  3. export default class ErrorTest extends Component { 
  4.   render() { 
  5.     return ( 
  6.       <div> 
  7.         <ErrorBoundary> 
  8.           <BugCounter></BugCounter> 
  9.         </ErrorBoundary> 
  10.         <span>my name is dan</span> 
  11.       </div> 
  12.     ); 
  13.   } 
  14.  
  15. // Bug 報(bào)錯(cuò)組件 
  16. class BugCounter extends Component { 
  17.   constructor(props) { 
  18.     super(props); 
  19.     this.state = { 
  20.       counter: 0, 
  21.     }; 
  22.   } 
  23.   click = () => { 
  24.     this.setState(({ counter }) => ({ counter: counter + 1 })); 
  25.   }; 
  26.   render() { 
  27.     if (this.state.counter === 5) { 
  28.       throw new Error("crashed!"); 
  29.     } 
  30.     return ( 
  31.       <div> 
  32.         <h3 onClick={this.click}>{this.state.counter}</h3> 
  33.       </div> 
  34.     ); 
  35.   } 
  36.  
  37. // 錯(cuò)誤邊界處理組件 
  38. class ErrorBoundary extends Component { 
  39.   constructor(props) { 
  40.     super(props); 
  41.     this.state = { hasError: false }; 
  42.   } 
  43.  
  44.   static getDerivedStateFromError(error) { 
  45.     // 更新 state 使下一次渲染能夠顯示降級(jí)后的 UI 
  46.     return { hasError: true }; 
  47.   } 
  48.  
  49.   render() { 
  50.     if (this.state.hasError) { 
  51.       // 你可以自定義降級(jí)后的 UI 并渲染 
  52.       return <h1>Something went wrong.</h1>; 
  53.     } 
  54.  
  55.     return this.props.children; 
  56.   } 

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

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

可以看到,雖然因?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)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/xuxiaowei/p/14645136.html

延伸 · 閱讀

精彩推薦
  • React使用hooks寫(xiě)React組件需要注意的5個(gè)地方

    使用hooks寫(xiě)React組件需要注意的5個(gè)地方

    這篇文章主要介紹了使用hooks寫(xiě)React組件需要注意的5個(gè)地方,幫助大家更好的理解和學(xué)習(xí)使用React組件,感興趣的朋友可以了解下...

    forrest醬8702022-02-24
  • React詳解對(duì)于React結(jié)合Antd的Form組件實(shí)現(xiàn)登錄功能

    詳解對(duì)于React結(jié)合Antd的Form組件實(shí)現(xiàn)登錄功能

    這篇文章主要介紹了詳解對(duì)于React結(jié)合Antd的Form組件實(shí)現(xiàn)登錄功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需...

    浮生離夢(mèng)6542022-02-23
  • React淺談react路由傳參的幾種方式

    淺談react路由傳參的幾種方式

    這篇文章主要介紹了淺談react路由傳參的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下...

    glorydx4582022-02-20
  • React一看就懂的ReactJs基礎(chǔ)入門(mén)教程-精華版

    一看就懂的ReactJs基礎(chǔ)入門(mén)教程-精華版

    現(xiàn)在最熱門(mén)的前端框架有AngularJS、React、Bootstrap等。自從接觸了ReactJS,ReactJs的虛擬DOM(Virtual DOM)和組件化的開(kāi)發(fā)深深的吸引了我,下面來(lái)跟我一起領(lǐng)略...

    雲(yún)霏霏9262022-02-22
  • React詳解react setState

    詳解react setState

    這篇文章主要介紹了react setState的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下...

    一個(gè)前端王4942022-02-27
  • ReactReact+Ant Design開(kāi)發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟

    React+Ant Design開(kāi)發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟

    這篇文章主要介紹了React+Ant Design開(kāi)發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋...

    qq_3341488311802022-02-24
  • React詳解react應(yīng)用中的DOM DIFF算法

    詳解react應(yīng)用中的DOM DIFF算法

    這篇文章主要介紹了react應(yīng)用中的DOM DIFF算法,幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下...

    time_w6232022-02-25
  • Reactreact hooks入門(mén)詳細(xì)教程

    react hooks入門(mén)詳細(xì)教程

    這篇文章主要介紹了react hooks入門(mén)詳細(xì)教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考...

    抱素_6832022-02-23
主站蜘蛛池模板: 黄色在线免费看 | 91精品国产人妻国产毛片在线 | 一区二区久久 | 欧美日韩精品一区二区在线观看 | 日韩成人在线一区二区 | 国产亚洲成av人片在线观看桃 | 亚洲91| 粉嫩一区二区三区 | 国产999精品久久久久 | 国产伦乱| 九九热在线观看 | 中文字幕 亚洲一区 | 91精品久久久久久 | 欧美伦理一区二区三区 | 亚洲婷婷一区二区三区 | 久久午夜精品 | 亚洲高清在线观看 | 日韩中文字幕免费在线播放 | 成人精品国产免费网站 | 黄瓜av| 日韩精品视频在线观看一区二区 | 亚洲精选国产 | 国产v日产∨综合v精品视频 | av大片在线观看 | www国产在线观看 | 国产日韩精品一区二区 | 日韩高清中文字幕 | 天天综合网91 | 国产日韩中文字幕 | 国产一区二区三区四 | 三区视频 | 国产精品久久久久久久久晋中 | 亚洲国产精品久久久久久 | 亚洲人免费视频 | 日本激情免费 | 久久久久久久久99精品 | 北条麻妃在线一区二区三区 | 91 久久 | 在线观看av网站 | 久久婷婷色 | 成人免费视频在线观看 |