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 相关文章推荐
Google 静态地图API实现代码
Nov 19 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
Apr 24 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 Javascript
JavaScript 常见安全漏洞和自动化检测技术
Aug 21 Javascript
浅析vue component 组件使用
Mar 06 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
Jun 05 jQuery
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
编写更好的JavaScript条件式和匹配条件的技巧(小结)
Jun 27 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通用检测函数集合
2011/02/08 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
jQuery表单验证插件解析(推荐)
2016/07/21 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
Python 常用 PEP8 编码规范详解
2017/01/22 Python
python实现简易版计算器
2020/06/22 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
Final类有什么特点
2012/04/25 面试题
伦敦奥运会的口号
2014/06/21 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
学校德育工作总结2015
2015/05/11 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
Pandas-DataFrame知识点汇总
2022/03/16 Python
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
Java中API的使用方法详情
2022/04/06 Java/Android
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL