首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

组件渲染后防止回流/重绘- ngFor - Angular 8

组件渲染后防止回流/重绘- ngFor - Angular 8

在Angular 8中,ngFor是一个常用的指令,用于在模板中循环渲染一组元素。然而,由于ngFor会在每次数据变化时重新渲染整个列表,可能会导致回流和重绘的性能问题。为了防止这种情况发生,我们可以采取以下措施:

  1. 使用trackBy函数:ngFor指令默认使用对象引用来跟踪列表中的每个元素。当列表中的元素发生变化时,ngFor会重新渲染整个列表。为了避免这种情况,我们可以通过提供一个trackBy函数来告诉ngFor如何跟踪元素的唯一标识。trackBy函数应该返回一个唯一标识符,通常是元素的ID。这样,当列表中的元素发生变化时,ngFor只会重新渲染发生变化的元素,而不是整个列表。

例如,假设我们有一个名为items的数组,其中包含多个对象,每个对象都有一个唯一的ID属性。我们可以在ngFor指令中使用trackBy函数来跟踪这些元素:

代码语言:txt
复制
<div *ngFor="let item of items; trackBy: trackById">
  {{ item.name }}
</div>

在组件中定义trackById函数:

代码语言:txt
复制
trackById(index: number, item: any): any {
  return item.id;
}
  1. 使用ChangeDetectionStrategy.OnPush:Angular的默认变更检测策略是ChangeDetectionStrategy.Default,它会在每次变更检测周期中检查组件的所有绑定。为了减少不必要的变更检测,我们可以将变更检测策略设置为ChangeDetectionStrategy.OnPush。这样,只有当输入属性发生变化或组件中的事件触发时,才会触发变更检测。

在组件的装饰器中设置变更检测策略:

代码语言:txt
复制
@Component({
  selector: 'app-my-component',
  templateUrl: './my-component.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush
})
  1. 使用虚拟滚动:如果列表中的元素数量非常大,可以考虑使用虚拟滚动来提高性能。虚拟滚动只会渲染可见区域内的元素,而不是整个列表。这样可以减少DOM操作和重绘的次数,从而提高性能。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供可扩展的云服务器实例,适用于各种规模的应用程序和工作负载。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的MySQL数据库服务,适用于各种规模的应用程序。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、可靠、低成本的云存储服务,适用于存储和处理各种类型的数据。产品介绍链接

请注意,以上链接仅供参考,具体的产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Web 性能优化-页面回流(重排)

,再加上主流前端框架(react、vue、angular)的已经帮我们解决了大多数的性能问题,但是前端渲染性能优化依然值得学习,除去网络方面的消耗,留给前端渲染的时间已经不多了。...render tree 中受到影响的部分失效,并重新构造这部分渲染树,完成回流,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重。...// 回流+ 浏览器 如果向上述代码中那样,浏览器不停地回流+,很可能性能开销非常大,实际上浏览器会优化这些操作,将所有引起回流的操作放入一个队列中,等待队列达到一定的数量或者时间间隔,就...: 使用 DocumentFragment 进行缓存操作,引发一次回流 了解DocumentFragment 给我们带来的性能优化 元素操作前使用 display: none,完成再将其显示出来...参考资料 16毫秒的优化 浏览器渲染页面过程与页面优化 页面回流以及优化

1.1K20

前端面试手册

-6 p 空: br hr img input link meta 导入样式link和@import的区别 作用范围、加载时机、兼容性三方面不同 CSS和JS的放置位置 CSS放在head防止页面回流...,JS放body末尾防止页面阻塞 标签语义化 用正确的标签做正确的事情,便于对浏览器、搜索引擎解析 HTML5的离线储存 localStorage 长期存储数据,浏览器关闭数据不丢失 sessionStorage...就是指这个对象 apply和call 在特定的作用域中调用,等于设置函数体内this对象的值,以扩充函数赖以运行的作用域 接收参数的方式不同 JS框架和原理 React单向数据,Vue结合angular...子传父emit、vuex ---- 综合 ---- 前端性能优化 加载:合并请求、缓存资源、外部文件、文件压缩、按需加载 图片:压缩、代替(css3、SVG、Iconfont)、webp、png8、...base64 样式:头部引入、避免内联、避免重设图片大小、优化选择符 脚本:减少回流、缓存dom和length、事件代理、ID选择 渲染:优化DOM结构、CSS3动画触发GPU 构建工具和原理

1.2K20
  • 前端性能优化 常见面试题速查

    # 回流渲染树中部分或者全部元素的尺寸、结构或者属性发生变化时,浏览器会重新渲染部分或者全部文档的过程即回流。...:对渲染树的某部分或者一个渲染对象进行重新布局 # 当页面中某些元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器就会对元素进行重新绘制,即。...、text-decoration、border-radius、visibility、box-shadow 等 注意:当触发回流时,一定会触发,但是不一定引发回流 # 如何避免回流 减少回流的措施...,因为 display 属性为 none 的元素上进行的 DOM 操作不会引发回流 将 DOM 的多个读操作(或者写操作)放在一起,而不是读写操作穿插着写,这得益于浏览器的渲染队列机制 浏览器针对页面的回流...,使用渲染队列进行了自身的优化 浏览器会将所有的回流的操作放到一个队列中,当队列中的操作到了一定的数量或者到达一定的时间间隔,浏览器就会对队列进行批处理,这会让多次的回流合并成一次 # 如何优化动画

    43120

    vue在浏览器中对DOM渲染探究

    Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小) Painting():根据渲染树以及回流得到的几何信息,得到节点的绝对像素 Display: 将像素发送给...因为浏览器有GUI渲染线程与JS引擎线程,为了防止渲染出现不可预期的结果,这两个线程是互斥的关系。...(Repaint)和回流(Reflow) 当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流)。这一阶段浏览器要做的事情是要弄清楚各个节点在页面中的确切位置和大小。...布局完成,浏览器会立即发出“Paint Setup”和“Paint”事件,将渲染树转换成屏幕上的像素。 回流会在我们设置节点样式时频繁出现,同时也会很大程度上影响性能。...是当节点需要更改外观而不会影响布局的,比如改变color就叫称为重 回流是布局或者几何属性需要改变就称为回流回流必定会发生不一定会引发回流

    1.2K10

    前端面试(3)vue

    JavaScript:回流(重排)与 回流(元素的布局位置,规模尺寸,隐藏等改变) 回流当 render tree 中的一部分或全部因为元素的规模尺寸、布局、隐藏等改变时,浏览器重新渲染部分 DOM...回流必将引起重,而不一定会引起回流。...如何减少回流 CSS 中避免回流 1.尽可能在 DOM 树的最末端改变 class 2.避免设置多层内联样式 3.动画效果应用到 position 属性为 absolute 或 fixed...的元素上 4.避免使用 table 布局 5.使用 css3 硬件加速,可以让 transform、opacity、filters 等动画效果不会引起回流 JS 操作避免回流 1.避免使用 JS...有时即便是回流一个单一的元素,也可能要求它的父元素以及任何跟随它的元素也产生回流。例如需要改变某个元素的背景,这就不涉及该元素的属性,所以只发生

    3.3K30

    浅析$nextTick和$forceUpdate

    例如,当你设置vm.someData = 'new value',对应的DOM更新会被推到一个队列里,该组件不会立即重新渲染,会在当前tick完毕,在下一个tick中渲染DOM。...操作DOM次数一多,也就等同于一直在进行线程之间的通信,并且操作DOM 而且可能还会带来回流的情况,所以也就导致了性能上的问题。 经典面试题:插入几万个 DOM,如何实现页面不卡顿?...(Repaint)和回流(Reflow) 回流会在我们设置节点样式时频繁出现,同时也会很大程度上影响性能。...是当节点需要更改外观而不会影响布局的,比如改变color就叫称为重 回流是布局或者几何属性需要改变就称为回流回流必定会发生不一定会引发回流。...这样回调函数在DOM更新完成就会调用。 mounted不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用vm.

    1.8K00

    浏览器渲染流程(下)

    浏览器渲染流程(下) 前言 上一篇讲了一点非常普遍的部分,可能很常听别人说(虽然部分还没讲)。 这一篇会讲点相对来说较少听到过的,如分层、光栅化、合成。 渲染流程 4....完整流程 图片 回流、合成 回流(Reflow) 回流需要重新根据CSSOM和DOM来计算布局树,然后完整执行渲染流水线,包括分层、绘制、合成(光栅化)。...浏览器窗口尺寸改变 初始渲染 (Repaint) 如果修改元素的背景颜色,不会触发布局、分层阶段,直接进入绘制阶段,然后执行之后的子阶段,这个过程就叫。...图片 不会触发布局、分层阶段,所以效率比起回流要高很多。 合成 如果使用CSS的transform来实现动画效果,会跳过布局和绘制阶段,直接在非主线程进行合成动画。...合成的效率比回流要高很多,因为合成是在非主线程进行合成,还跳过了布局和绘制阶段。 图片 可以在CSS Triggers查看,那些属性会触发回流、合成。

    1.4K30

    回流

    在绘制时根据渲染树布局,再根据布局绘制,这就是回流回流:改变几何属性的渲染。又称重排。 :改变外观属性而不影响几何属性的渲染。...在生成渲染树之后,至少会渲染一次,但在后续交互时还会不断地重新渲染。这时只会回流或只有,因此引出一个定向法则:回流必定引发不一定引发回流。 用户的交互操作引发了网页的渲染。...4.避免规则层级过多 浏览器的CSS解析器解析css文件时,对CSS规则是从右到左匹配查找,样式层级过多会影响回流效率,建议保持CSS规则在3层左右。...7.将频繁回流的节点设置为图层。 在浏览器中设置频繁回流的节点为一张新图层,那新图层就能够阻止节点的渲染行为影响别的节点,这张图层中如何变化都无法影响到其他图层。...8.使用requestAnimationFrame作为动画帧 动画速度越快,回流次数越多。

    63020

    回流_html回流

    : 了解前端Dom代码、css样式、js逻辑代码到浏览器展现过程 了解什么是图层 了解回流 了解前端层面针对重回流如何优化 css图层 浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小...不会带来重新布局,所以并不一定伴随回流。 需要注意的是:是以图层为单位,如果图层中某个元素需要,那么整个图层都需要。...计算这些值的过程称为布局或回流”不一定需要”回流”,比如改变某个网页元素的颜色,就只会触发””,不会触发”回流”,因为布局没有改变。...“回流”大多数情况下会导致””,比如改变一个网页元素的位置,就会同时触发”回流”和””,因为布局改变了。...【将DOM离线再修改】 由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的回流。 如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成再显示。

    1.4K20

    浏览器重回流

    回流 回流是浏览器渲染的时候进行的操作,当页面内容发生改变的时候,就会触发或者回流 渲染树中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color...,则就叫称为重Repaint,不一定触发回流。...每个页面至少需要一次回流,就是在页面第一次加载的时候,这时候是一定会发生回流的,因为要构建渲染树,回流一定触发。 Reflow的成本比Repaint的成本高得多的多。...CSS3硬件加速 CSS3硬件加速也就是GPU加速,可以transform、opacity、filters这些动画不会引起回流,但是对于动画的其它属性,比如background-color这些,还是会引起回流的...调试 在很多浏览器的开发者工具中提供了渲染操作的性能分析,以谷歌浏览器为例,其performance就可以查看各构建过程的性能消耗,在Rendering中可以使用Paint flashing高亮区域

    98720

    你真的了解回流

    浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流,如果大家想直接看如何减少回流,可以跳到后面。(这个渲染过程来自MDN) ?... 最终,我们通过构造渲染树和回流阶段,我们知道了哪些节点是可见的,以及可见节点的样式和具体的几何信息(位置、大小),那么我们就可以将渲染树的每个节点都转换为屏幕上的实际像素,这个阶段就叫做节点。...既然知道了浏览器的渲染过程,我们就来探讨下,何时会发生回流。 何时发生回流 我们前面知道了,回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流。...页面一开始渲染的时候(这肯定避免不了) 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的) 注意:回流一定会触发,而不一定会回流 根据改变的范围和程度,渲染树中或大或小的部分需要重新计算...总结 本文主要讲了浏览器的渲染过程、浏览器的优化机制以及如何减少甚至避免回流,希望可以帮助大家更好的理解回流。 参考文献 渲染树构建、布局及绘制 高性能Javascript

    1.3K21

    你真的了解回流吗?(面试必问)

    浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流,如果大家想直接看如何减少回流,可以跳到后面。...(如下图) 最终,我们通过构造渲染树和回流阶段,我们知道了哪些节点是可见的,以及可见节点的样式和具体的几何信息(位置、大小),那么我们就可以将渲染树的每个节点都转换为屏幕上的实际像素,这个阶段就叫做节点...既然知道了浏览器的渲染过程,我们就来探讨下,何时会发生回流。 何时发生回流 我们前面知道了,回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流。...页面一开始渲染的时候(这肯定避免不了) 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的) 注意:回流一定会触发,而不一定会回流 根据改变的范围和程度,渲染树中或大或小的部分需要重新计算...总结 本文主要讲了浏览器的渲染过程、浏览器的优化机制以及如何减少甚至避免回流,希望可以帮助大家更好的理解回流

    2.1K40

    【翻译】浏览器渲染Rendering那些事:repaint、reflowrelayout、restyle

    屏幕的更新行为称作-repaint,或者redraw。 回流的性能消耗是非常严重的,破坏用户体验,造成UI卡顿。...四、触发/回流的机制 改变任何影响构造渲染树的行为都会触发,例如 增加、删除、更新DOM节点; 通过display:none隐藏节点会触发回流,通过visibility:hidden隐藏只会触发...通过这种方法,多次引发回流的操作会被组合在一起,以便在一个回流中完成。浏览器将这些操作加入到缓存队列中,当到达一定的时间间隔,或者累积了足够多的操作行为执行它们。...),然后对隐藏的节点进行100个操作(这些操作都会单独触发回流),完毕将节点的display改回原值(此时再次触发一次回流)。...最后,我们复习一下几个术语: 渲染树-DOM树的虚拟部分; 渲染树中的节点称为结构体或者盒子; 重新计算渲染树的行为被Mozilla称为回流-reflow,被其他浏览器称为layout; 将重新计算渲染树更新到屏幕的行为叫做

    1K60

    前端| 性能优化总结

    09 浏览器重(Repaint)和回流(Reflow): 回流必将引起重不一定会引起回流。...回流(Reflow) 当 Render Tree 中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。...现代浏览器会对频繁的回流操作进行优化:浏览器会维护一个队列,把所有引起回流的操作放入队列中,如果队列中的任务数量或者时间间隔达到一个阈值的,浏览器就会将队列清空,进行一次批处理,这样可以把多次回流变成一次...也可以先为元素设置 display: none,操作结束再把它显示出来。因为在 display 属性为 none 的元素上进行的 DOM 操作不会引发回流。...避免频繁读取会引发回流/的属性,如果确实需要多次使用,就用一个变量缓存起来。 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流

    74220

    useLayoutEffect和useEffect执行时机有什么不同

    流程react 在 diff ,会进入到 commit 阶段,准备把虚拟 DOM 发生的变化映射到真实 DOM 上在 commit 阶段的前期,会调用一些生命周期方法,对于类组件来说,需要触发组件的...,到此为止 react 仅用一次回流的代价,就把所有需要更新的 DOM 节点全部更新完成浏览器渲染完成,浏览器通知 react 自己处于空闲阶段,react 开始执行自己调度队列中的任务,此时才开始执行...可以看到在流程9/10期间,DOM 已经被修改,但但浏览器渲染线程依旧处于被阻塞阶段,所以还没有发生回流过程。...,依旧只有一次回流的代价。...如果放在 useEffect 里,useEffect 的函数会在组件渲染到屏幕之后执行,此时对 DOM 进行修改,会触发浏览器再次进行回流,增加了性能上的损耗。

    1.5K30

    React的useLayoutEffect和useEffect执行时机有什么不同

    流程react 在 diff ,会进入到 commit 阶段,准备把虚拟 DOM 发生的变化映射到真实 DOM 上在 commit 阶段的前期,会调用一些生命周期方法,对于类组件来说,需要触发组件的...,到此为止 react 仅用一次回流的代价,就把所有需要更新的 DOM 节点全部更新完成浏览器渲染完成,浏览器通知 react 自己处于空闲阶段,react 开始执行自己调度队列中的任务,此时才开始执行...可以看到在流程9/10期间,DOM 已经被修改,但但浏览器渲染线程依旧处于被阻塞阶段,所以还没有发生回流过程。...,依旧只有一次回流的代价。...如果放在 useEffect 里,useEffect 的函数会在组件渲染到屏幕之后执行,此时对 DOM 进行修改,会触发浏览器再次进行回流,增加了性能上的损耗。

    1.8K40

    浏览器学习之渲染原理与渲染优化

    渲染对象被创建并添加到树中,它们并没有位置和大小,所以当浏览器生成渲染树以后,就会根据渲染树来进行布局(又称回流)。这一阶段浏览器要做的事情就是要弄清各个节点在页面中的确切位置和大小。...通常这一行为又称为“自动重排” 布局阶段结束是会绘制阶段,遍历渲染树并调用渲染对象的paint方法,将它们的内容显示在屏幕上,绘制使用UI基础组件。...style标签中 (3)针对DOM树、CSSOM树: HTML文件的代码层级尽量不要太深 使用语义化的标签,来避免不标准语义化的特殊处理 减少CSSD代码的层级,因为选择器是从左向右进行解析的 (4)减少回流...,因为在display属性为none的元素上进行DOM操作不会引发回流 将DOM的多个读(写)操作放在一起,而不是读写操作穿插着写,这得益于浏览器的渲染队列机制 浏览器会将所有的回流的操作放在一个队列中...这样就会让多次的回流变成一次回流

    1.1K31

    你真的了解回流

    浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流,如果大家想直接看如何减少回流,优化性能,可以跳到后面。...(如下图) 最终,我们通过构造渲染树和回流阶段,我们知道了哪些节点是可见的,以及可见节点的样式和具体的几何信息(位置、大小),那么我们就可以将渲染树的每个节点都转换为屏幕上的实际像素,这个阶段就叫做节点...既然知道了浏览器的渲染过程,我们就来探讨下,何时会发生回流。 何时发生回流 我们前面知道了,回流这一阶段主要是计算节点的位置和几何信息,那么当页面布局和几何信息发生变化的时候,就需要回流。...页面一开始渲染的时候(这肯定避免不了) 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的) 注意:回流一定会触发,而不一定会回流 根据改变的范围和程度,渲染树中或大或小的部分需要重新计算...总结 本文主要讲了浏览器的渲染过程、浏览器的优化机制以及如何减少甚至避免回流,希望可以帮助大家更好的理解回流。 参考文献 渲染树构建、布局及绘制 高性能Javascript

    4.9K50

    React的useLayoutEffect和useEffect执行时机有什么不同

    流程react 在 diff ,会进入到 commit 阶段,准备把虚拟 DOM 发生的变化映射到真实 DOM 上在 commit 阶段的前期,会调用一些生命周期方法,对于类组件来说,需要触发组件的...,到此为止 react 仅用一次回流的代价,就把所有需要更新的 DOM 节点全部更新完成浏览器渲染完成,浏览器通知 react 自己处于空闲阶段,react 开始执行自己调度队列中的任务,此时才开始执行...可以看到在流程9/10期间,DOM 已经被修改,但但浏览器渲染线程依旧处于被阻塞阶段,所以还没有发生回流过程。...,依旧只有一次回流的代价。...如果放在 useEffect 里,useEffect 的函数会在组件渲染到屏幕之后执行,此时对 DOM 进行修改,会触发浏览器再次进行回流,增加了性能上的损耗。

    1.9K30

    【综合篇】Web前端性能优化原理问题

    脚本优化,减少回流,缓存dom选择与计算,缓存列表length,尽量使用事件代理,避免批量绑定事件,尽量使用id选择器,使用touchstart,touchend代替click。...什么是回流的机制?​ 频繁重回流会导致ui频繁渲染,导致JavaScript变慢。...回流,当render tree中的一部分因为元素的规模尺寸,布局等改变需要重新构建,会触发回流,当render tree中的一些元素需要修改属性,这些属性不影响元素的外观,风格,布局,就叫做,...所以回流一定会引起重,但是不一定会引起回流。 掌握一些css属性​ ​ ? 将频繁重回流的元素单独出来,作为一个独立的图层,那么这个元素的回流就只能影响这个图层中。...把一个元素独立成独立的图层,用css属性 避免使用触发回流的css属性,回流很频繁可以独立出来。

    1.7K30
    领券