Angular利用trackBy提升性能的方法


Posted in Javascript onJanuary 26, 2018

在Angular的模板中遍历一个集合(collection)的时候你会这样写:

<ul>
 <li *ngFor="let item of collection">{{item.id}}</li>
</ul>

有时你会需要改变这个集合,比如从后端接口返回了新的数据。那么问题来了,Angular不知道怎么跟踪这个集合里面的项,不知道哪些该添加哪些该修改哪些该删除。结果就是,Angular会把该集合里的项全部移除然后重新添加。就像这样:

Angular利用trackBy提升性能的方法

这样做的弊端是会进行大量的DOM操作,而DOM操作是非常消耗性能的。

那么解决方案是,为*ngFor添加一个trackBy函数,告诉Angular该怎么跟踪集合的各项。trackBy函数需要两个参数,第一个是当前项的index,第二个是当前项,并返回一个唯一的标识,就像这样:

import{ Component } from '@angular/core';

@Component({
 selector: 'trackBy-test',
 template: `
 <ul><li *ngFor="let item of items; trackBy: trackByIndex">{{item.name}}</li></ul>
 <button (click)="getItems()">Get Items</button>
 `
})
export class TrackByCmp{
 items: any[]=[];
 constructor(){
  this.items = [{name:'Tom'},{name:'Jerry'},{name:'Kitty'}];
 }
 getItems(){
  this.items = [{name:'Tom'},{name:'Jerry'},{name:'Mac'},{name:'John'}];
 }
 trackByIndex(index, item){
  return index;
 }
}

这样做之后,Angular就知道哪些项变动了:

Angular利用trackBy提升性能的方法

我们可以看到,DOM只重绘了修改和增加的项。而且,再次点击按钮是不会重绘的。但是在没有添加trackBy函数的时候,重复点击按钮还是会触发重绘的(可以回头看第一个GIF)。

以上所述是小编给大家介绍的Angular利用trackBy提升性能的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
如何确保JavaScript的执行顺序 之实战篇
Mar 03 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
May 16 Javascript
js判断生效时间不得大于失效时间的思路及代码
Apr 23 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
Aug 27 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
Dec 27 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
Dec 29 Javascript
jQuery表格的维护和删除操作
Feb 03 Javascript
深入理解Angular4中的依赖注入
Jun 07 Javascript
移动端效果之Swiper详解
Oct 09 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
Sep 06 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
vue使用axios实现excel文件下载的功能
Jul 16 Javascript
微信小程序版翻牌小游戏
Jan 26 #Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 #Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 #Javascript
微信小程序实现animation动画
Jan 26 #Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
Jan 26 #Javascript
微信小程序如何获取openid及用户信息
Jan 26 #Javascript
微信小程序如何获取用户手机号
Jan 26 #Javascript
You might like
FCKeditor的安装(PHP)
2007/01/13 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
吐槽一下我所了解的Node.js
2014/10/08 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Python request post上传文件常见要点
2020/11/20 Python
Python修改DBF文件指定列
2020/12/19 Python
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
亚洲在线旅行门户网站:Expedia.com.hk(智游网)
2020/04/14 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
应届生会计电算化求职信
2013/10/03 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
全陪导游词开场白
2015/05/29 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
Python实现双向链表基本操作
2022/05/25 Python
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server