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创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
一次失败的jQuery优化尝试小结
Feb 06 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
asp.net中System.Timers.Timer的使用方法
Mar 20 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
AngularJS的内置过滤器详解
May 14 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
jQuery点击头像上传并预览图片
Feb 23 Javascript
浅谈Vue.js组件(二)
Apr 09 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
Jun 21 Javascript
layui 上传图片 返回图片地址的方法
Sep 26 Javascript
使用jQuery实现掷骰子游戏
Oct 24 jQuery
微信小程序版翻牌小游戏
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 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
php 缩略图实现函数代码
2011/06/23 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JQuery中each()的使用方法说明
2010/08/19 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
Python的多态性实例分析
2015/07/07 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
Python csv模块使用方法代码实例
2019/08/29 Python
django admin 添加自定义链接方式
2020/03/11 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
英文简历中的自荐信范文
2013/12/14 职场文书
电脑教师的自我评价
2013/12/18 职场文书
消防应急演练方案
2014/02/12 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
小学评语大全
2014/04/22 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
百年孤独读书笔记
2015/06/29 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers