说说你在React项目是如何捕获错误的?

一、是什么

错误在我们日常编写代码是非常常见的

举个例子,在react项目中去编写组件内JavaScript代码错误会导致 React 的内部状态被破坏,导致整个应用崩溃,这是不应该出现的现象

作为一个框架,react也有自身对于错误的处理的解决方案

二、如何做

为了解决出现的错误导致整个应用崩溃的问题,react16引用了错误边界新的概念

错误边界是一种 React 组件,这种组件可以捕获发生在其子组件树任何位置的 JavaScript 错误,并打印这些错误,同时展示降级 UI,而并不会渲染那些发生崩溃的子组件树

错误边界在渲染期间、生命周期方法和整个组件树的构造函数中捕获错误

形成错误边界组件的两个条件:

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

抛出错误后,请使用 static getDerivedStateFromError() 渲染备用 UI ,使用 componentDidCatch() 打印错误信息,如下:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // 更新 state 使下一次渲染能够显示降级后的 UI
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // 你同样可以将错误日志上报给服务器
    logErrorToMyService(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // 你可以自定义降级后的 UI 并渲染
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children;
  }
}

然后就可以把自身组件的作为错误边界的子组件,如下:

<ErrorBoundary>
  <MyWidget />
</ErrorBoundary>

下面这些情况无法捕获到异常:

  • 事件处理
  • 异步代码
  • 服务端渲染
  • 自身抛出来的错误

在react 16版本之后,会把渲染期间发生的所有错误打印到控制台

除了错误信息和 JavaScript 栈外,React 16 还提供了组件栈追踪。现在你可以准确地查看发生在组件树内的错误信息:

可以看到在错误信息下方文字中存在一个组件栈,便于我们追踪错误

对于错误边界无法捕获的异常,如事件处理过程中发生问题并不会捕获到,是因为其不会在渲染期间触发,并不会导致渲染时候问题

这种情况可以使用js的try...catch...语法,如下:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { error: null };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    try {
      // 执行操作,如有错误则会抛出
    } catch (error) {
      this.setState({ error });
    }
  }

  render() {
    if (this.state.error) {
      return <h1>Caught an error.</h1>
    }
    return <button onClick={this.handleClick}>Click Me</button>
  }
}

除此之外还可以通过监听onerror事件

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

参考文献

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

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

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

相关文章

vuecli3 批量打印二维码

安装以个命令: npm install qrcode --save npm install print-js --save 页面使用: import qrcode from qrcode import printJS from print-js <el-button type"primary" click"handleBulkPrint">批量打印</el-button>methods: {// 批量打印…

c++ 信奥赛编程 2049:【例5.19】字符串判等

#include <iostream> using namespace std; string strlwr(string s) { for(int i0;i<s.size();i){if(s[i]>A && s[i]<Z)s[i]s[i]-Aa;}return s; } int main() {string str1,str2; //定义两个字符串变量 getline(cin,str1); //通过函数输入字符串 getl…

集成运算放大电路

引用原文链接&#xff1a; 集成运放及其经典电路详解 - 知乎 (zhihu.com) 1、 反比例运算放大器 输入负电压则输出正电压&#xff0c;输入正电压则输出负电压 2、同相放大电路&#xff08;同相指输入电压与输出电压的位相相同&#xff09; 输入负电压则输出负电压&#xf…

网络测试工具—— iperf2 安卓APK 下载 及简单使用

网络测试工具—— iperf2 安卓APK 下载 及简单使用 前言一、iperf2是什么&#xff1f;二、使用步骤附上help中命令截图翻译总结 前言 项目上有一款安卓车机加载局域网图片加载非常慢&#xff0c;所以需要测试一个安卓车机设备的带宽&#xff0c;经过调研后使用到了iperf2。 一…

四阶龙格库塔与元胞自动机

龙格库塔法参考&#xff1a; 【精选】四阶龙格库塔算法及matlab代码_四阶龙格库塔法matlab_漫道长歌行的博客-CSDN博客 龙格库塔算法 Runge Kutta Method及其Matlab代码_龙格库塔法matlab_Lzh_023016的博客-CSDN博客 元胞自动机参考&#xff1a; 元胞自动机&#xff1a;森林…

Globalsign证书

GlobalSign是全球可信的数字证书提供商之一&#xff0c;提供广泛的证书服务&#xff0c;包括SSL证书、代码签名证书、电子邮件证书等&#xff0c;帮助保护企业和个人的网络安全。本文将详细介绍GlobalSign证书的特点和优势&#xff0c;帮助您更好地了解这一重要的数字证书提供商…

快速了解什么是跳跃表(skip list)

什么是跳跃表&#xff08;skip list&#xff09; 跳跃表&#xff08;Skip List&#xff09;是一种概率性的数据结构&#xff0c;它通过在多层链表的基础上添加“快速通道”来提高搜索效率。跳跃表的效率可以与平衡树相媲美&#xff0c;即在平均和最坏的情况下&#xff0c;查找…

selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候&#xff0c;会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作&#xff1b;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中&#xff0c;有一个专门的类来负责实现这些测试场…

如何在在线Excel文档中规范单元格输入

在日常的工作中&#xff0c;我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能&#xff0c;它可以帮助用户规范单元格的输入&#xff0c;从而提…

C++入门学习(4)引用 (讲解拿指针比较)

上期回顾 在学习完函数重载之后&#xff0c;我们可以使用多个重名函数进行操作&#xff0c;会发现C真的是弥补了好多C语言的不足之处&#xff0c;真的不禁感概一下&#xff0c;时代的进步是需要人去做出改变的&#xff0c;而不是一味的使用啊&#xff01;所以我们今天继续学一下…

chrome v3开发插件实现所有网站允许跨域

场景&#xff1a; chrome 插件 升级到v3后&#xff0c;原来修改请求响应都变成异步&#xff0c;即无法同步拦截来修改请求响应。 在v3中也不支持修改请求响应内容。 问题&#xff1a;如何在chrome v3中允许其他网站跨域呢。 方式一&#xff1a;禁用chrome跨域&#xff0c;禁…

修改a-rate评分颜色;a-rate评分十分制

使用ant-design-vue的rate评分组件 1。修改颜色 2。十分制&#xff08;默认是5分&#xff0c;改成10分。且提示也是10分制&#xff09; <a-rate v-model"score" :tooltips"rate10" allow-half hoverChange"changeRate" />data() {score: …

数据结构算法-回溯算法

引言 在原神的世界中&#xff0c;小森决定挑战自我&#xff0c;踏上了寻找风神的迷宫——风之迷宫。这个迷宫就像是一个巨大的电玩城&#xff0c;让小森感到困惑和无助。他站在迷宫的入口&#xff0c;看着眼前乱糟糟的路径&#xff0c;内心充满了不安和焦虑。 “派蒙&#xf…

高效接口重试机制的实现

实现一个高效的接口重试机制对于保证系统的稳定性和可靠性至关重要。在面对网络不稳定、服务端故障或者高负载的情况下&#xff0c;接口重试机制能够确保请求的成功执行&#xff0c;同时也需要保证在重试过程中不会造成额外的负担或不必要的延迟。本文将为您介绍高效接口重试机…

如何提高企业竞争力?CRM管理系统告诉你

随着竞争形势和商业环境的加剧&#xff0c;企业需要迅速适应不断变化的消费需求。不少企业使用CRM客户管理系统来优化业务流程&#xff0c;管理客户信息&#xff0c;实现更多的业绩增长。那么我们来说说&#xff0c;CRM系统如何提高企业竞争力&#xff1f; 强大的数据管理&…

HarmonyOS ArkTS基础知识

概述 上一节&#xff0c;学习了TypeScript的基础语法&#xff0c;而在鸿蒙开发当中&#xff0c;有基于自己的编程语言&#xff0c;便是ArkTS。它是一种声明式UI的编程范式的语言&#xff0c;开发框架如下图所示&#xff1a; 根据框架图&#xff0c;分析&#xff0c;我将它大致…

pycharm pro v2023.2.4(Python开发)

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm提供了强大的功能&#xff0c;包括语法突出显示、智能代码完成、代码检查、自动重构和调试等特性&#xff0c;这些都可以帮助Python开发人员更加高效地编写代码。 PyCharm Pro是PyCharm的高级版…

【图】:常用图搜索(图遍历)算法

目录 概念图遍历深度优先搜索 (DFS)DFS 适用场景DFS 优缺点 广度优先搜索 (BFS)BFS 适用场景BFS 优缺点 DFS & BFS 异同点 图搜索Dijkstra算法A*算法Floyd算法Bellman-Ford算法SPFA算法 概念 图遍历和图搜索是解决图论问题时常用的两种基本操作。 图遍历是指从图中的某一个…

nssm部署nginx

nssm install Nginx8098 --安装nginx nssm start Nginx8098 --启用nginx nginx 选择nginx路径&#xff0c;安装

易云维®工厂能耗管理平台系统方案,保证运营质量,推动广东制造企业节能减排

我国《关于完整准确全面贯彻新发展理念推进碳达峰碳中和工作的实施意见》出台&#xff0c;提出了推进碳达峰碳中和工作的总体目标。到2025年&#xff0c;广东具备条件的地区、行业和企业率先实现碳达峰&#xff0c;为全省实现碳达峰、碳中和奠定坚实基础&#xff1b;2030年前实…