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 相关文章推荐
一个用js实现控制台控件的代码
Sep 04 Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 Javascript
javascript如何使用bind指定接收者
May 04 Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 Javascript
js实现图片无缝滚动
Dec 23 Javascript
D3.js实现散点图和气泡图的方法详解
Sep 21 Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 Javascript
实例讲解javascript实现异步图片上传方法
Dec 05 Javascript
vue中的过滤器实例代码详解
Jun 06 Javascript
小程序分页实践之编写可复用分页组件
Jul 18 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
Aug 20 Javascript
Element Carousel 走马灯的具体实现
Jul 26 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
Python函数基本使用原理详解
2020/03/19 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
2014年小学语文工作总结
2014/12/20 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
公司档案管理制度
2015/08/05 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL