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 相关文章推荐
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
Apr 10 Javascript
JS判断不能为空实例代码
Nov 26 Javascript
Javascript中3个需要注意的运算符
Apr 02 Javascript
jquery组件WebUploader文件上传用法详解
Oct 23 Javascript
input框中的name和id的区别
Nov 16 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
详解node-ccap模块生成captcha验证码
Jul 01 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
开发用到的js封装方法(20种)
Oct 12 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 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测试程序运行时间的类
2012/02/05 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
php使用百度天气接口示例
2014/04/22 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
php封装的smarty类完整实例
2016/10/19 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
python学生管理系统学习笔记
2019/03/19 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
班组长岗位职责
2014/03/03 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
农村文化建设标语
2014/10/07 职场文书
中班下学期幼儿评语
2014/12/30 职场文书