網(wǎng)站首頁 編程語言 正文
首先 我們先構(gòu)建出問題的場景
我們創(chuàng)建一個react項目
然后在src下創(chuàng)建 components 文件夾目錄
在下面創(chuàng)建一個 error.jsx 組件
參開代碼如下
import React from "react";
export default class App extends React.Component{
constructor(props){
super(props);
this.state = {
}
}
render(){
return (
<div>
{ null.bingt }
</div>
)
}
}
這時 就會有人說了 你這 null.bingt 不是擺明會報錯嗎?
沒錯 我們要的就是報錯
找到src下的 App.js 編寫代碼如下
import './App.css';
import React from "react";
import Error from "./components/error";
export default class App extends React.Component{
constructor(props){
super(props);
this.state = {
}
}
render(){
return (
<div>
<span>你好</span>
<Error/>
</div>
)
}
}
運行之后 控制臺直接報錯 界面白屏 但其實 App組件上還有個你好啊 說明 整個項目都沒渲染出來
直接白屏 版本低一點的react還會出現(xiàn)報錯的專門的界面 但在上線之后 客戶看到的就是一片空白
但我們想 因為一個組件報錯 導(dǎo)致整個項目都運行不起來 這合理嗎?
顯然是不合理的
此時 我們可以在 components 目錄下創(chuàng)建 ErrorBoundary.jsx組件
參考代碼如下
import React from "react"
export default class ErrorBoundary extends React.Component{
state = {
hasError:false,
error:null,
errorInfo:null
}
componentDidCatch(error,errorInfo){
this.setState({
hasError:true,
error:error,
errorInfo:errorInfo
})
}
render(){
if(this.state.hasError){
return <div>{ this.props.render(this.state.error,this.state.errorInfo) }</div>
}
return this.props.children;
}
}
此時 我們的一個捕獲錯誤的組件就寫好了
然后 改寫 src下的 App.js
代碼如下
import './App.css';
import React from "react";
import Error from "./components/error";
import ErrorBoundary from "./components/ErrorBoundary";
export default class App extends React.Component{
constructor(props){
super(props);
this.state = {
}
}
render(){
return (
<div>
<span>你好</span>
<ErrorBoundary render ={ (error,errorInfo) => <p>{ '加載時發(fā)生錯誤' }</p>}>
<Error/>
</ErrorBoundary>
</div>
)
}
}
此時 我們將ErrorBoundary捕獲報錯的組件 套在了Error外面
然后 編寫 當(dāng)報錯時 就渲染
{ ‘加載時發(fā)生錯誤’ }
運行結(jié)果如下
控制臺依舊會輸出報錯信息 但 將不會運行到其他組件的渲染 而且 我們指定報錯后 渲染的
{ ‘加載時發(fā)生錯誤’ }
也成功渲染出來了
就是 之后我們指定可能某個組件 會報錯 就可以用這個組件套一下 避免一個組件報錯 整個項目白屏的情況
原文鏈接:https://blog.csdn.net/weixin_45966674/article/details/128756729
相關(guān)推薦
- 2022-09-27 C#中對字符串進(jìn)行壓縮和解壓的實現(xiàn)_C#教程
- 2022-08-21 Android實現(xiàn)手寫板功能_Android
- 2022-04-16 一盤王者的時間用C語言實現(xiàn)三子棋_C 語言
- 2023-04-14 使用?React?hooks?實現(xiàn)類所有生命周期_React
- 2022-07-14 Android實現(xiàn)多點觸控功能_Android
- 2022-05-24 flutter實現(xiàn)頭部tabTop滾動欄_Android
- 2024-03-03 Layui 主窗口調(diào)用 iframe 彈出框模塊,獲取控件的相應(yīng)值
- 2022-11-23 Python利用keyboard模塊實現(xiàn)鍵盤記錄操作_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支