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 继承详解(一)
Jul 13 Javascript
js计算页面刷新的次数
Jul 20 Javascript
JS获取html对象的几种方式介绍
Dec 05 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
简介JavaScript中valueOf()方法的使用
Jun 05 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
Jan 25 Javascript
AngularJS 使用 UI Router 实现表单向导
Jan 29 Javascript
React服务端渲染(总结)
Jul 01 Javascript
node.js操作MongoDB的实例详解
Oct 11 Javascript
Vue.js 踩坑记之双向绑定
May 03 Javascript
基于rollup的组件库打包体积优化小结
Jun 18 Javascript
vue动态绑定class选中当前列表变色的方法示例
Dec 19 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
PHPLog php 程序调试追踪工具
2009/09/09 PHP
php中函数的形参与实参的问题说明
2010/09/01 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
kali中python版本的切换方法
2019/07/11 Python
python cookie反爬处理的实现
2020/11/01 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
幼儿园保教管理制度
2014/02/03 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
交通处罚决定书
2015/06/24 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers