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 相关文章推荐
向fckeditor编辑器插入指定代码的方法
May 25 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
javascript自定义的addClass()方法
May 28 Javascript
Jquery解析Json格式数据过程代码
Oct 17 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
Jun 05 Javascript
JavaScript中String.match()方法的使用详解
Jun 06 Javascript
微信小程序之小豆瓣图书实例
Nov 30 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
Jan 19 Javascript
详解vue表单验证组件 v-verify-plugin
Apr 19 Javascript
vue-awesome-swiper滑块插件使用方法详解
Nov 27 Javascript
使用React代码动态生成栅格布局的方法
May 24 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
koa源码中promise的解读
2018/11/13 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
python实现按任意键继续执行程序
2016/12/30 Python
Python决策树分类算法学习
2017/12/22 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Python常见字典内建函数用法示例
2018/05/14 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
python面向对象 反射原理解析
2019/08/12 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
历史系毕业生自荐信
2013/10/28 职场文书
煤矿班组长的职责
2013/12/25 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
聘用意向书
2014/07/29 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
python入门之算法学习
2021/04/22 Python