Angular:OnPush变化检测策略介绍
在OnPush策略下,Angular不会运行变化检测(Change Detection ),除非组件的input
接收到了新值。接收到新值的意思是,input
的值或者引用发生了变化。这样听起来不好理解,看例子:
子组件接收一个balls
(别想歪:))输入,然后在模板遍历这个balls
数组并展示出来。初始化2秒后,往balls
数组push一个new ball
:
//balls-list.component.ts
@Component({
selector: 'balls-list',
template: `
<div *ngFor="let ball of balls">{{ball}}</div>
`
})
export class BallsList implements OnInit{
@Input() balls: any[];
ngOnInit(){
setTimeout(() => {
this.balls.push('new ball');
},2000)
}
}
注意:因为鼠标键盘事件会触发变化检测,所以这里使用定时器!
现在是不使用OnPush策略的情况。2秒后,new ball就被添加到视图中了。
当使用OnPush变化检测策略的时候,new ball并不会被添加到视图中:
//balls-list.component.ts
@Component({
selector: 'balls-list',
template: `
<div *ngFor="let ball of balls">{{ball}}</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class BallsList implements OnInit{
@Input() balls: any[];
ngOnInit(){
setTimeout(() => {
this.balls.push('new ball');
},2000)
}
}
但是,如果在父组件改变input
的值,视图是会更新的,因为这样Angular会运行变化检测:
//app.component.ts
@Component({
selector: 'my-app',
template: `
<balls-list [balls]="balls"></balls-list>
<button (click)="changeRef()">Change Ref</button>
`,
})
export class AppComponent implements OnInit{
balls: any[] = ['basketball','football'];
ngOnInit(){}
changeRef(){
this.balls = ['baseball','pingpong'];
}
}
这样就相当于改变了balls
的引用。
但是,如果不改变balls
的引用,只给它push一个值,视图是不会更新的:
//app.component.ts
@Component({
selector: 'my-app',
template: `
<balls-list [balls]="balls"></balls-list>
<input #input>
<button (click)="addBall(input.value)">Add a ball</button>
`,
})
export class AppComponent implements OnInit{
balls: any[] = ['basketball','football'];
ngOnInit(){}
addBall(ball){
this.balls.push(ball);
}
}
这时如果有需要,我们可以用ChangeDetectorRef.detectChanges()
手动触发变化检测。
这样解释应该很清楚了!
提示:OnPush配合Immutable.js使用效果更佳!
本文代码和演示可以在这里查看(建议电脑访问,自备梯子)。
不当之处欢迎指出,欢迎交流!
Angular:OnPush变化检测策略介绍的更多相关文章
- angular 2+ 变化检测系列二(检测策略)
我们将创建一个简单的MovieApp来显示有关一部电影的信息.这个应用程序将只包含两个组件:显示有关电影的信息的MovieComponent和包含执行某些操作按钮的电影引用的AppComponent. ...
- angular 2+ 变化检测系列一(基础概念)
什么是变化检测? 变化检测的基本功能就是获取应用程序的内部状态(state),并且是将这种状态对用户界面保持可见.状态可以是javascript中的任何的数据结构,比如对象,数组,(数字,布尔,字符串 ...
- GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍
一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...
- Linux内核策略介绍
Linux内核策略介绍学习笔记 主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...
- HBase 的MOB压缩分区策略介绍
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zNZQhb07Nr/article/details/79832392 HBase应用场景很广泛.社区 ...
- 【组策略】1.组策略介绍group policy
组策略介绍group policy 高效学习法,念念不忘,必有回响. 分享一个高效学习思维,潜意识思考.就是在您没有大量时间的情况下,学习十分钟. 然后离开去完成别的事情的时候,大脑潜意识中还会继续思 ...
- Angular中ngCookies模块介绍
1.Cookie介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短 ...
- angular中重要指令介绍($eval,$parse和$compile)
在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者 ...
- angular 2+ 变化检测系列三(Zone.js在Angular中的应用)
在系列一中,我们提到Zone.js,Zones是一种执行上下文,它允许我们设置钩子函数在我们的异步任务的开始位置和结束位置,Angular正是利用了这一特性从而实现了变更检测. Zones.js非常适 ...
随机推荐
- 抓包工具之—charles碎言碎语
一.Charles常见使用场景: 1.Charles是跨平台的抓包工具,支持Windows,mac或Linux平台: 2.获取请求信息.测试接口时,若接口文档中的参数不清楚或没有接口文档时,可以通过抓 ...
- ensorflow学习笔记四:mnist实例--用简单的神经网络来训练和测试
http://www.cnblogs.com/denny402/p/5852983.html ensorflow学习笔记四:mnist实例--用简单的神经网络来训练和测试 刚开始学习tf时,我们从 ...
- Linux负载均衡实现
配置之前清空所有服务器防火墙规则 iptables -F 关闭selinux: 1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开 ...
- C++ 命名管道示例
想做一个 Hook CreateFile 重定向到内存的功能,貌似可以假借命名管道实现这个功能.不熟悉命名管道,做了几个demo,如下: Server: // NamedPipeServer.cpp ...
- Python解决ModuleNotFoundError: No module named 'Queue'的问题
我们知道Python2和Python3两个版本之间,有些不兼容的地方,Python3中引入Queue会报出这个问题. Python3中要这样引入: import queue Python2中要这样引入 ...
- 使用K近邻算法改进约会网站的配对效果
1 定义数据集导入函数 import numpy as np """ 函数说明:打开并解析文件,对数据进行分类:1 代表不喜欢,2 代表魅力一般,3 代表极具魅力 Par ...
- Node.js实战14:一个简单的TCP服务器。
本文,将会展示如何用Nodejs内置的net模块开发一个TCP服务器,同时模拟一个客户端,并实现客户端和服务端交互. net模块是nodejs内置的基础网络模块,通过使用net,可以创建一个简单的tc ...
- Billboard 题解 hdu2795
Billboard 题解 hdu2795 题意 有个广告牌,上面需要依次贴广告,广告的高度均为1,但是宽度不同,每次都想贴在最靠左上的位置,按照顺序进行广告的话,输出每个广告位于广告牌的高度. 解题思 ...
- Codeforces 396C (DFS序+线段树)
题面 传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u, ...
- 又一年NOIP后的一波总结
(昨天正式考完了吧...先写一下现在的感受,出成绩以及后续继续更...) 按照国际惯例,还是先讲一下故事吧. Day(~,0] 大概是跟随者时间的推进,气氛越来越紧张吧. 平时好像大家和往常一样,日常 ...