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阻止浏览器后退事件防止误操作清空表单
Nov 22 Javascript
Javascript selection的兼容性写法介绍
Dec 20 Javascript
javascript 常见功能汇总
Jun 11 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
May 20 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
浅谈Angular 中何时取消订阅
Nov 22 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
Nov 26 Javascript
小试SVG之新手小白入门教程
Jan 08 Javascript
使用Vue CLI创建typescript项目的方法
Aug 09 Javascript
vue实现动态表格提交参数动态生成控件的操作
Nov 09 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实现链式操作的核心思想
2015/06/23 PHP
PHP文件操作实例总结
2016/09/27 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
JS中min函数实例讲解
2019/02/18 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python实现Windows电脑定时关机
2018/06/20 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
浅谈python之新式类
2018/08/12 Python
基于python实现KNN分类算法
2020/04/23 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
详解HTML5中的标签
2015/06/19 HTML / CSS
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
建筑学推荐信
2013/11/03 职场文书
班队活动设计方案
2014/01/30 职场文书
小学师德师风演讲稿
2014/09/02 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
如何解决.cuda()加载用时很长的问题
2021/05/24 Python