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 innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
button没写type=button会导致点击时提交
Mar 06 Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
Nov 26 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
使用JS实现图片展示瀑布流效果的实例代码
Sep 12 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 Javascript
bootstrap multiselect 多选功能实现方法
Jun 05 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
Aug 04 Javascript
AngularJS ui-router刷新子页面路由的方法
Jul 23 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 jQuery
js实现多图和单图上传显示
Dec 18 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
德生1994机评
2021/03/02 无线电
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHP Socket 编程
2010/04/09 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
php mysql 封装类实例代码
2016/09/18 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
JavaScript面象对象设计
2008/04/28 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
javascript history对象详解
2017/02/09 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
python发送HTTP请求的方法小结
2015/07/08 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python3.5的包存放的具体路径
2020/08/16 Python
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
销售活动策划方案
2014/08/26 职场文书
环境卫生倡议书
2014/08/29 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
死亡赔偿协议书
2015/01/28 职场文书
情况说明书格式及范文
2019/06/24 职场文书
vue 实现上传组件
2021/05/31 Vue.js
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL