摘要:为什么会慢呢因为对的修改为影响网页的用户界面,重绘页面是一项昂贵的操作。太多的操作会导致一系列的重绘操作,为了确保执行结果的准确性,所有的修改操作是按顺序同步执行的。回流操作主要会发生在几种情况下当对节点执行新增或者删除操作时。
一. 函数式编程
React 把用户界面抽象成一个个组件,如按钮组件 Button、对话框组件 Dialog、日期组件 Calendar。 开发者通过组合这些组件,最终得到功能丰富、可交互的页面。通过引入 JSX 语法,复用组件变得非常容易, 同时也能保证组件结构清晰。有了组件这层抽象,React 把代码和真实渲染目标隔离开来,除了可以在浏览器 端渲染到 DOM 来开发网页外,还能用于开发原生移动应用。
二 虚拟DOM
DOM操作的效率是很低的,而且不是一般的慢,而且这也是引发性能问题的常见问题之一。为什么会慢呢? 因为对 DOM的修改为影响网页的用户界面,重绘页面是一项昂贵的操作。太多的DOM操作会导致一系列的重 绘操作,为了确保执行结果的准确性,所有的修改操作是按顺序同步执行的。我们称这个过程叫做回流 (reflow),同时这也是最昂贵的浏览器操作之一。回流操作主要会发生在几种情况下:
当对DOM节点执行新增或者删除操作时。
动态设置一个样式时(比如element.style.width="10px")。
当获取一个必须经过计算的尺寸值时,比如访问offsetWidth、clientHeight或者其他需要经过计算的CSS值(在兼容DOM的浏览器中,可以通过getComputedStyle函数获取;在IE中,可以通过currentStyle属性获取)。 解决问题的关键,就是限制通过DOM操作所引发回流的次数。大部分浏览器都不会在JavaScript的执行过程中更新DOM。相应的,这些浏览器将对对DOM的操作放进一个队列,并在JavaScript脚本执行完毕以后按顺序一次执行完毕。也就是说,在JavaScript执行的过程中,用户不能和浏览器进行互动,直到一个回流操作被执行。(失控脚本对话框会触发回流操作,因为他执行了一个中止JavaScript执行的操作,此时会对用户界面进行更新)
真实页面对应一个 DOM 树。在传统页面的开发模式中,每次需要更新页面时,都要手动操作DOM进行更新。DOM 操作非常昂贵。我们都知道在前端开发中,性能消耗最大的就是 DOM 操作,而且这部分代码会让整体项目的代码变得难以维护。React 把真实 DOM 树转换成 JavaScript 对象树,每次数据更新后,重新计算 Virtual DOM,并和上一次生成的 Virtual DOM 做对比,对发生变化的部分做批量更新。React 也提供了直观的 houldComponentUpdate 生命周期回调,来减少数据变化后不必要的 Virtual DOM 对比过程,以保证性能。我们说 Virtual DOM 提升了 React 的性能,但这并不是 React 的唯一亮点。此外,Virtual DOM的渲染方式也比传统 DOM 操作好一些,但并不明显,因为对比 DOM 节点也是需要计算资源的。它最大的好处其实还在于方便和其他平台集成,比如 react-native 是基于 Virtual DOM 渲染出原生控件,因为 React 组件可以映射为对应的原生控件。在输出的时候,是输出 Web DOM,还是 Android 控件,还是 iOS 控件,就由平台本身决定了。因此,react-native 有一个口号——LearnOnce,Write Anywhere。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95560.html
摘要:希望大家在这浮夸的前端圈里,保持冷静,坚持每天花分钟来学习与思考。 今天的React题没有太多的故事…… 半个月前出了248个Vue的知识点,受到很多朋友的关注,都强烈要求再出多些React相前的面试题,受到大家的邀请,我又找了20多个React的使用者,他们给出了328道React的面试题,由我整理好发给大家,同时发布在了前端面试每日3+1的React专题,希望对大家有所帮助,同时大...
摘要:本文翻译自原作者如果有任何版权问题,请联系当你在组件中调用时,你觉得会发生什么当然,会用这条状态重新渲染组件并且更新匹配到的,然后返回元素。如果你之前使用过一些渲染器比如说,你可能知道在页面中使用超过一个渲染器是没什么问题的。 本文翻译自:How Does setState Know What to Do?原作者:Dan Abramov 如果有任何版权问题,请联系shuirong199...
摘要:为了使用它们,您可以向组件添加一个属性,该属性的值是一个回调函数,它将接收底层的元素或组件的已挂接实例,作为其第一个参数。通常最好使用另一个生命周期方法,而不是依赖这个回调函数,但是很高兴知道它存在。 React 常见的面试题 (在 React 里面,你可以知道也可以不知道的事, 但是你会发现他们确实很有用) 根据记录,问这些问题可能不是深入了解他们在使用 React 方面的经验的最...
摘要:因为版本将真正废弃这三生命周期到目前为止,的渲染机制遵循同步渲染首次渲染,更新时更新时卸载时期间每个周期函数各司其职,输入输出都是可预测,一路下来很顺畅。通过进一步观察可以发现,预废弃的三个生命周期函数都发生在虚拟的构建期间,也就是之前。 showImg(https://segmentfault.com/img/bVbweoj?w=559&h=300); 背景 前段时间准备前端招聘事项...
摘要:内部机制探秘和文末附彩蛋和源码这篇文章比较偏基础,但是对入门内部机制和实现原理却至关重要。当然也需要明白一些浅显的内部工作机制。当改变出现时,相比于真实更新虚拟的性能优势非常明显。直到最终,会得到完整的表述树的对象。 React 内部机制探秘 - React Component 和 Element(文末附彩蛋demo和源码) 这篇文章比较偏基础,但是对入门 React 内部机制和实现原...
摘要:来自于中文编码规范编码规范算是最合理的编码规范之一了基本规范每个文件只写一个模块但是多个无状态模块可以放在单个文件中推荐使用语法不要使用,除非从一个非的文件中初始化你的创建模块如果你的模块有内部状态或者是推荐使用而不是除非你有充足的理由 来自于Airbnb React/JSX 中文编码规范 Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 Bas...
阅读 2535·2021-10-19 11:41
阅读 2399·2021-09-01 10:32
阅读 3355·2019-08-29 15:21
阅读 1726·2019-08-29 12:20
阅读 1132·2019-08-29 12:13
阅读 581·2019-08-26 12:24
阅读 2502·2019-08-26 10:26
阅读 757·2019-08-23 18:40