15 错误边界与使用技巧

错误边界

  • React16增加
  • 防止某个组件的UI渲染错误导致整个应用崩溃
  • 子组件发生JS错误,有备用的渲染UI
  • 错误边界是组件,只能用class组件来写

错误边界组件捕获错误的时机

  • 渲染时
  • 生命周期函数中
  • 组件树的构造函数中

getDerivedStateFromError

  • 生命周期函数 static getDerivedStateFromError(error)
  • 参数:子组件抛出的错误
  • 返回值:新的state
  • 渲染阶段调用
  • 作用:不允许出现副作用(异步代码、操作dom等)

componentDidCatch

  • 生命周期函数
  • 组件原型上的方法
  • 边界组件捕获异常,并进行后续处理
  • 作用:错误信息获取,运行副作用
  • 在组件抛出错误后调用
  • 参数:error(抛出的错误)、info(组件引发错误相关的信息,即组件栈)
componentDidCatch(err, info) {console.log('componentDidCatch err', err)console.log('componentDidCatch info', info)
}

在这里插入图片描述

无法捕获的场景

  • 1.事件处理函数(无法显示备用UI)
function Correct() {const handleClick = () => {console.log('点击')throw new Error('click throw err')}return (<div onClick={handleClick}>正常显示内容</div>)
}
<ErrorBoundary><Correct />
</ErrorBoundary>

在这里插入图片描述

  • 2.异步 setTimeout、ajax
function Correct() {const err = () => {setTimeout(() => {throw new Error('抛出错误')}, 1000)}err()return (<div>正常显示内容</div>)
}
<ErrorBoundary><Correct />
</ErrorBoundary>

在这里插入图片描述

  • 3.服务端渲染
  • 4.错误边界组件(ErrorBoundary)内部有错误
class ErrorBoundary extends React.Component {state = {hasError: false,}static getDerivedStateFromError() {return {hasError: true}}render() {if (this.state.hasError) {return (<h1>This is Error UI{data}</h1>)}return this.props.children}
}
<ErrorBoundary><TestErr />
</ErrorBoundary>

在这里插入图片描述

以上几种情况有可能导致整个React组件被卸载

示例代码

class ErrorBoundary extends React.Component {state = {hasError: false,}static getDerivedStateFromError() {return {hasError: true}}render() {if (this.state.hasError) {return (<h1>This is Error UI</h1>)}return this.props.children}
}
function TestErr() {return (<h1>{data}</h1>)
}
function Correct() {return (<div>正常显示内容</div>)
}
function App() {return (<div><ErrorBoundary><TestErr /></ErrorBoundary><Correct /></div>)
}
ReactDOM.render(<App />,document.getElementById('app')
)

在这里插入图片描述

错误边界组件能向上冒泡

  • TestErr有错误,冒泡到 ErrorBoundaryErrorBoundary自身也有错误
  • 如果多个嵌套错误边界组件 → 则从最里层错误触发、向上冒泡触发捕获
<ErrorBoundary2><ErrorBoundary><TestErr /></ErrorBoundary>
</ErrorBoundary2>

在这里插入图片描述

  • 在开发模式下,错误会冒泡至window,而生产模式下,错误不会冒泡,详见文档
class ErrorBoundary2 extends React.Component {constructor(props) {super(props)window.onerror = function (err) {console.log('window.onerror err', err)}}state = {hasError: false,}static getDerivedStateFromError(err) {return {hasError: true}}render() {if (this.state.hasError) {return (<h1>This is Error UI2</h1>)}return this.props.children}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6 --- Promise.all等待多个异步任务执行

项目中遇到一个问题,要用多个http请求,获取数据,然后将获取的数据统一处理… 第一反应想到用promise.all来做… 下面进入主体 // 首先使用promise封装http请求. function getListByDetecttype (params) {return new Promise((resolve, reject) > {let param params ? par…

Mac 下查看网络端口占用情况

1、Mac 下查看网络端口占用情况 有的时候关闭了服务器&#xff0c;但是端口还是占用&#xff0c;解决的方法是 kill 掉占用该端口的进程。 # 查看 8009 端口的占用情况 $ lsof -i:8009 可以看到&#xff0c;该端口被 id 为 4215 的进程所占用&#xff0c;这个时候直接在命令…

javascript --- 变量提升的理解

看下面一段代码: (function () {var x foo();var foo function foo () {return "foobar";};return x; })();(不许打出来)猜猜返回结果是什么… 答案是 // foo is not a function下面来解释为什么会这样,首先得明白: 1.如果变量声明了但未赋值,则会显示undefined…

分布式监控系统开发【day37】:需求讨论(一)

本节内容 为什么要做监控&#xff1f; 常用监控系统设计讨论监控需求讨论如何实现监控服务器的水平扩展&#xff1f;监控系统架构设计一、为什么要做监控&#xff1f; 熟悉IT监控系统的设计原理开发一个简版的类Zabbix监控系统掌握自动化开发项目的程序设计思路及架构解藕原则…

iOS:练习题中如何用技术去实现一个连线题

一、介绍 本人做的app涉及的是教育行业&#xff0c;所以关于练习题的开发肯定是家常便饭。例如&#xff0c;选择题、填空题、连线题、判断题等&#xff0c;每一种题型都需要技术去实现&#xff0c;没啥多大难度&#xff0c;这里呢&#xff0c;就给出实现连线题的核心代码吧。过…

213. House Robber II 首尾相同的偷窃问题

&#xff3b;抄题&#xff3d;&#xff1a; You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of…

19、20 Context API

安装React Dev Tool Context对象.displayName 使用别名 不使用别名 React.createContext 创建指定的Context对象组件会找离自己最近的Provider&#xff0c;获取其value变量名都叫value的情况&#xff0c;就近取AContext变量名有所区分&#xff0c;两个value都可以获取可以…

01-spring配置详解

1 bean元素 <!--将User对象交给spring容器进行管理 --><!-- Bean元素:使用该元素描述需要spring容器管理的对象class属性:被管理对象的完整类名.name属性:给被管理的对象起个名字.获得对象时根据该名称获得对象. 可以重复.可以使用特殊字符.id属性: 与name属性一模一…

Vite+Vue3页面空白、图标不显示问题解决

页面空白问题 由于项目部署在子文件夹下&#xff0c;因此需要配置vite.config.js const config {base: ./, }el-icon图标不显示、打包时mkdir无权限 在控制台Network看字体图标的请求&#xff0c;发现地址多了_assets&#xff0c;本以为需要重新配置publicDir&#xff0c;后…

javascript --- 自定义数组的反序函数

想写一个自定义的_reverse函数,其作用是将传入的数组进行部分反序. 效果如下: 输入[1,2,3,4,5,6,7,8,9] 第一个将2~4个位置的数字反序 第二个将2~6个位置的数字反序. // js function _reverse(arr, s, e) {arr arr.join().slice(0,s) arr.join().slice(s,e).split().revers…

21 Fragment和短语法应用

React.Fragment jsx语法&#xff0c;相当于document.createDocumentFragment()创建文档碎片容器&#xff0c;优化渲染解决了没有根节点的问题<></>这种短语法也会声明React.Fragment但短语法不支持keyReact.Fragment只支持key属性&#xff0c;其余属性如事件等不支…

201521123004《软件工程》个人阅读作业1

task1Task2: 201521123004 林艺如 博客&#xff1a;https://www.cnblogs.com/dabaolyr/ 码云&#xff1a;https://gitee.com/dabao_lyr Task3&#xff1a;完成博客-阅读与思考 阅读参考材料&#xff0c;并回答下面几个问题&#xff1a; &#xff08;1&#xff09;回想一下你初入…

在sql当中为了让数据做缓存做with as的操作

今天看别人的代码&#xff0c;突然发现之前理解的sql的with as的用法有新的理解。 之前理解的with as只是想着做单表的union all 操作时才使用&#xff0c;今天发现在可以使用逗号做分割&#xff0c;做缓存不同的表数据。 下面的例子如下&#xff1a; WITH t1 AS (SELECT file_…

javascript --- 从数组中,找出比给定元素大一丁点的元素

目标如下: 从数组[1,3,2,4,5,6,7]中找到比第1个位置大一丁点的元素 function _findIndex(arr, j){let k -1;let key arr[j];for(let i j; i< arr.length; i) {if(arr[i] > key) {if( k ! -1){if(arr[i] < arr[k]) {k i;}} else {k i;}}}return k } let arr [1,…

22 React高阶组件

搭建服务端 yarn add express yarn add nodemon 在server目录下 npm init -y // 增加dev脚本"scripts": {"dev": "nodemon ./index.js"},引入 git HOC High Order Component 高阶组件&#xff0c;是组件的抽象HOC不是React提供的API&#xf…

AngularJS:表达式

ylbtech-AngularJS&#xff1a;表达式1.返回顶部 1、AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML。 AngularJS 表达式 AngularJS 表达式写在双大括号内&#xff1a;{{ expression }}。 AngularJS 表达式把数据绑定到 HTML&#xff0c;这与 ng-bind 指令有异曲同…

省选模拟赛记录(越往下越新哦~~~)

LOG 模拟赛第一次见尼玛这么给数据范围的……开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会……思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大力打了一波表……转身T3,码出25分的O(n^2)算法,然后不会了……去了T2,码出35分的O(n…

flutter --- 使用dio包

打开pubspec.yaml找到dependencies在最下面添加 dio: ^1.0.9ctrl s 之后,会自动下载依赖 使用: // get请求 import package:dio/dio.dart; Dio dio new Dio(); var response await dio.get("/test", data:{"id":12, "name":"marron&qu…

24 React.createRef()用法细节分析

通过React.createRef → ref对象通过元素的ref属性可以附加到React元素上一般通过构造器中给this的属性赋值一个ref&#xff0c;方便整个组件使用ref只要传递到react元素中&#xff0c;就可以利用ref的current属性访问到该真实DOM节点ref在componentDidMount和componentDidUpda…

dart --- 环境配置

1.进入官网下载SDK http://www.gekorm.com/dart-windows/ 2.运行下载的EXE文件.下一步下一步… 3.打开小黑框,输入: dart --version VSCode关于Dart的插件: DartCode Runner 插件安装好后,需重启VSCode. 新建 index.dart,输入以下代码 main () {print("Hello Dart…