错误边界

  • 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}
}

15 错误边界与使用技巧相关推荐

  1. 经验丰富程序员才知道的15种高级Python小技巧

    本文将介绍15个简洁的Python技巧,向着简洁更高效,学习易懂出发. 目录 1.通过多个键值将对象进行排序 2.数据类别 3.列表推导 4.检查对象的内存使用情况 5.查找最频繁出现的值 6.属性包 ...

  2. [react] React v15中怎么处理错误边界?

    [react] React v15中怎么处理错误边界? React 15 中有一个支持有限的错误边界方法 unstable_handleError.此方法不再起作用,同时自 React 16 beta ...

  3. react 错误边界_React with GraphQL和错误边界中的自定义错误页面

    react 错误边界 by Abi Noda 通过Abi Noda React with GraphQL和错误边界中的自定义错误页面 (Custom error pages in React with ...

  4. reactjs错误边界:用来捕获后代组件的错误,渲染出备用页面

    8. 错误边界 理解: 错误边界(Error boundary):用来捕获后代组件错误,渲染出备用页面 特点: 只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件.定时 ...

  5. 16 代码分割之错误边界与Suspense和命名导出

    代码分割之错误边界与Suspense const Main = React.lazy(() => import('./main')) class ErrorBoundary extends Re ...

  6. react跳转到网络异常页面_React错误边界处理

    最近在项目编写过程中发现经常会因为接口问题抛出各种各的错误,有的时候页面甚至会直接白屏,非常影响用户体验.为此,我仔细研究了一下React处理异常的方案,下面我将开始我的分享. 错误边界的作用 前端异 ...

  7. React 高级应用 -- 错误边界 Error Boundaries

    GitHub 学习 Demo. 部分 UI 的异常不应该破坏了整个应用.为了解决 React 用户的这一问题,React 16 引入了一种称为 "错误边界" 的新概念. 错误边界的 ...

  8. java怎么定位error_程序遇到错误定位一些小技巧

    程序遇到错误定位一些小技巧 前言:作为一个后端开发在写程序的过程中遇到错误然后一点点查找修改是痛苦的事情,开始会想:"我擦,明明写的是正确的为什么会错啊",然后被虐了一遍又一遍的时 ...

  9. 《Excel 职场手册:260招菜鸟变达人》一第 4 招 身份证号码、银行卡号等超过15位数据的录入技巧...

    本节书摘来异步社区<Excel 职场手册:260招菜鸟变达人>一书中的第1章,第4节,作者: 聂春霞 , 佛山小老鼠 责编: 王峰松,更多章节内容可以访问云栖社区"异步社区&qu ...

最新文章

  1. MAT入门到精通(二)
  2. PNAS:水稻微生物组
  3. python映射类型-详解Python中映射类型(字典)操作符的概念和使用
  4. JS实现html国际化二
  5. Java中几个主流的数据库连接池
  6. 【转】图解phpstorm常用快捷键
  7. 硅谷2020最新大数据学习路线:科学使用这一招,12周助你成为数据分析师
  8. 面向对象编程的五大基本原则
  9. 使用XLog、Spring-Boot、And-Design-Pro搭建日志系统
  10. 使用了Spring boot devtools, dozer转换嵌套对象失败解决记录
  11. Ubuntu18.04安装有道词典
  12. 如何修改docker容器的hostname
  13. c语言实现皇帝翻牌游戏
  14. 学生对计算机课程的意见和建议怎么写,对学校的意见和建议5条怎么写
  15. 个人学习(解决)练习ssm框架遇到的问题No qualifying bean of type ‘service.BookTypeService‘ available:
  16. vue中集成的ui组件库_Vue组件可使用Vault Flow通过Braintree集成PayPal付款
  17. 弹簧质量阻尼器的动力学
  18. 对 Spring 的核心(AOP 和 IOC)的理解(大白话)
  19. 遥感图像的高时空融合前期学习总结
  20. Uva 12627 Erratic Expansion

热门文章

  1. 计算机一般的应用课题方向,计算机类哪个方向的课题好立项
  2. python模块管理工具,Python的包管理工具
  3. 主叫号码未显示怎么设置_微信未授权抖音,应该怎么设置?
  4. 图形学教程Lecture 13: RayTracing1(Whitted-Style Ray Tracing)知识点总结
  5. GPU Gems2 - 13 动态环境光遮蔽与间接光照(Dynamic Ambient Occlusion and Indirect Lighting)
  6. php取json子对象属性,php中输出json对象的值(实现方法)
  7. 批量下载哨兵(Sentinel)数据
  8. OpenCV使用Tensorflow2-Keras模型
  9. DIV常用属性大全自己整理
  10. 404页面 3秒后跳到首页 实现