react配置上下文路由(React中Portals与错误边界处理实现)
react配置上下文路由
React中Portals与错误边界处理实现目录
- Portals
- 错误边界处理
- 如果没有使用错误边界会怎样?
- 注意点
可以说是 插槽,但 不同于 Vue 中的 slot,它指的是将一个 React 元素渲染到指定的容器 (真实 DOM) 中
比如说,Modal 组件一般默认直接作为 body 的真实结构的子元素渲染出来,那么我们就可以借助 ReactDOM.createPortal(ReactElement, RealDOM container) 创建一个 React 元素,示例代码:
import React from 'react' import ReactDOM from 'react-dom' import Modal from './components/Modal' const PortalModal = ReactDOM.createPortal(<Modal />, document.body) export default function App() { return <li className="app-container"> <PortalModal /> </li> }
我们可以在浏览器控制台中看到,真实的 Modal 组件其实是作为 body 的直接子元素渲染出来的,但通过 React 开发者工具,我们可以看到 Modal 组件在虚拟 DOM 树的结构中依旧在 App 组件下,类名为 app-container 的 li 中
所以,我们可以得出结论:React 组件虚拟 DOM 树结构与真实 DOM 树结构可以是不一致的
因而需要注意事件冒泡
- React 中的事件其实是经过包装的
- 它的事件冒泡是根据虚拟 DOM 树的结构来冒泡的,而不是真实 DOM 树的冒泡机制
默认情况下,若一个组件在渲染期间 (render) 发生错误,那么就会导致整个组件树全部被卸载
错误边界:就是一个组件,用于捕获 渲染期间 子组件发生的错误,并有能力阻止错误继续向父组件传播
让某个组件捕获错误 (类组件):
使用静态方法 static getDerivedStateFromError,子组件渲染错误时会触发此函数
- 静态方法,所以不能使用 this
- 此函数返回值 (对象) 会与 state 混合覆盖状态
- 触发时间点为:渲染子组件发生错误后,在更新页面之前
- 只有子组件渲染发生错误,才会触发 (即自身组件发生错误或其兄弟组件、父组件发生错误均不会触发)
import React, {PureComponent} from 'react' export default class ErrorBoundary extends PureComponent { state = { isError: false } static getDerivedStateFromError(error) { console.log('Rendering Error: ', error) return { isError: true } } render() { if (this.isError) { return <span>Something Wrong...</span> } return this.props.children } }
使用 componentDidCatch(error, info) 函数
- 是个实例方法
- 运行时机在渲染子组件发生错误后,且页面更新之后 (更改状态会导致组件树卸载完之后又重新构建组件树,比较浪费效率)
- 通常该函数用于往后台传递并记录错误信息
import React, {PureComponent} from 'react' export default class ErrorBoundary extends PureComponent { state = { isError: false } componentDidCatch(error, info) { // info 即为错误的摘要信息 console.log('Rendering Error: ', error) console.log('Rendering info: ', info) this.setState({ isError: true }) } render() { if (this.isError) { return <span>Something Wrong...</span> } return this.props.children } }
自 React 16 起,任何未被错误边界捕获的错误将会导致整个 React 组件树被卸载。
经验告诉我们,完全移除比保留错误UI更好。例如,在类似 Messenger 的产品中,把异常的 UI 展示给用户可能会导致用户将信息错发给别人。
增加错误边界能够让你在应用发生异常时提供更好的用户体验。例如,Facebook Messenger 将侧边栏、信息面板、聊天记录以及信息输入框包装在单独的错误边界中。如果其中的某些 UI 组件崩溃,其余部分仍然能够交互。
注意点某些错误,错误边界组件不会捕获
自身组件的错误
异步的错误 (如 setTimeout 中抛出的错误)
import React, {PureComponent} from 'react' // ErrorBoundary.jsx export default class ErrorBoundary extends PureComponent { state = { isError: false } /* 此函数不会运行 */ static getDerivedStateFromError(error) { console.log('Rendering Error: ', error) return { isError: true } } render() { if (this.isError) { return <span>Something Wrong...</span> } return this.props.children } } // Comp.jsx Comp 组件 export default funtion Comp() { setTimeout(() => { throw new Error('setTimeout error') }, 1000) return <li>Comp</li> } // App.jsx 使用 export default function App() { return <> <ErrorBoundary> <Comp /> </ErrorBoundary> </> }
事件中抛出的错误
即:仅处理渲染子组件期间的同步错误
到此这篇关于React中Portals与错误边界处理实现的文章就介绍到这了,更多相关React Portals与错误边界处理内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- react子组件的动态参数(浅谈React Component生命周期函数)
- react和antd管理系统(手把手教你从零开始react+antd搭建项目)
- react动态添加组件属性(react使用antd的上传组件实现文件表单一起提交功能完整代码)
- react代码展示(教你如何从 html 实现一个 react)
- vue中的ref(Vue3.0中Ref与Reactive的区别示例详析)
- react组件封装成函数方法(React虚拟列表的实现)
- vscode react jsx语法 开发环境(React-vscode使用jsx语法的问题及解决方法)
- react新手指引页面编写(React+TypeScript进行项目构建案例讲解)
- react 使用实例(React+高德地图实时获取经纬度,定位地址)
- react实现js控制样式(React + Threejs + Swiper 实现全景图效果的完整代码)
- react 查看word文件(React实现导入导出Excel文件)
- reacthooks用法(详解React Hooks是如何工作的)
- react教程简介(react入门级详细笔记)
- react绑定详解(React列表栏及购物车组件使用详解)
- react怎么使用父组件(关于antd tree和父子组件之间的传值问题react 总结)
- react执行流程(React开启代理的2种实用方式)
- 嘉南传 第22集(嘉南传第22集)
- 哪版孙悟空最萌 黄渤躺萌了(哪版孙悟空最萌)
- 融入小人物的喜怒哀乐,黄渤饰演的角色为什么让人观看时欲罢不能(融入小人物的喜怒哀乐)
- 《极限挑战》深访都市夜归人,夜间打工者体验,黄磊录完憔悴了(极限挑战深访都市夜归人)
- Google 推出了一个游戏生成器,让不会编程的你也能自己设计游戏(推出了一个游戏生成器)
- 二胎家庭老大爱闹情绪,用这招很有效(二胎家庭老大爱闹情绪)
热门推荐
- python 模块详解(举例讲解Python常用模块)
- x86与x64的区别?云服务器如何选择操作系统?(x86与x64的区别?云服务器如何选择操作系统?)
- 如何使用python定时运行(Python实现定时执行任务的三种方式简单示例)
- win7iis服务器的安装与配置(用IIS建立高安全性Web服务器的方法)
- C#静态变量、静态方法、静态类
- jquery中change()
- mysql删除的delete怎么找回(MySQL Delete 删数据后磁盘空间未释放的原因)
- sparkdataframe如何变换列名(spark dataframe 将一列展开,把该列所有值都变成新列的方法)
- oracle自定义异常
- sql多条件查询汇总语句(SQL判断语句用法和多表查询)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9