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学习资源站点
Aug 29 Javascript
JavaScript 加号(+)运算符号
Dec 06 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
Nov 14 Javascript
jQuery学习基础知识小结
Nov 25 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
Bootstrap组合上、下拉框简单实现代码
Mar 06 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
详解Vue文档中几个易忽视部分的剖析
Mar 24 Javascript
javascript定时器的简单应用示例【控制方块移动】
Jun 17 Javascript
分享15个Webpack实用的插件!!!
Mar 31 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
PHP 如何向 MySQL 发送数据
2006/10/09 PHP
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
村级环境卫生整治方案
2014/05/04 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
英文导游词
2015/02/13 职场文书
财务出纳岗位职责
2015/03/31 职场文书
国情备忘录观后感
2015/06/04 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android