不知道啥 data 改變,每個都檢查過就知道了
AngularJS
Angular
才不管啥 data 改變,全部重 render 就對了
React
我知道啥 data 改變了,因為被改變時會收到通知
Vue
不知道啥 data 改變,每個都檢查過就知道了
AngularJS
Angular
才不管啥 data 改變,全部重 render 就對了
React
我知道啥 data 改變了,因為被改變時會收到通知
Vue
Dirty Checking
AngularJS
Angular
機制:
所有 watcher 都檢查 data 有沒有改變 (digest loop)
template/$watcher 都算是 watcher
每次會執行 2~10 次的 digest loop 來檢查值
因為 child 也可能改變 parent
Graph, not Tree
<h1>Hello {{yourName}}!</h1>什麼時候檢查?
每個非同步動作被觸發的時候就檢查
e.g. 點擊,XHR,timeout ...etc
API:
template: 提供 ng 開頭的 api 來觸發檢查
js: 提供 $ 開頭的 api 來觸發檢查
//js api example
$timeout(function() {
$scope.greetings = "Hello World!";
}, 5000);//html api example
<button ng-click="greeting()">Hello</button>機制:
所有 watcher 都檢查 data 有沒有改變 (digest loop)
只會由上往下檢查一次
什麼時候檢查?
每個非同步動作被更新的時候就檢查
e.g. 點擊,XHR,timeout ...etc
API:
template: (event)
js: Angular 會 patch 所有的非同步 API
每個非同步 API 中都加上 hook 通知 Angular 更新
因此無須額外的 js API 可以觸發檢查
//html api example
<button (click)="greeting()">Hello</button>Unidirectional flow
減少 API
AOT (Ahead of Time) 技術
減少動態語法
Unidirectional flow
減少 API
AOT 技術
在 Change Detection 的速度上快了 3~10x
不知道啥 data 改變,每個都檢查過就知道了
AngularJS
Angular
才不管啥 data 改變,全部重 render 就對了
React
我知道啥 data 改變了,因為被改變時會收到通知
Vue
React
只要狀態改變,就整個 Component 重 render
效仿 Server Rendering
因此不需要關注 Data 改變的差異
Data 改變就全部重 render
Performance?
DOM 操作很慢
parse、repaint、reflow
機制:
React render 時先呼叫 virtual DOM render
以 JS 物件模擬 DOM 結構
即 virtual DOM
與先前的 virtual DOM 做 diff
把 diff 的部分 patch 回真實的 DOM 中
用途:
為 render 到 DOM 前的緩衝層
可想成 DOM 層面的變更檢查機制
優點:
實際上只會讓 DOM 去 re-render 有 diff 的部分
解決全部重 render 會拖慢速度的問題
什麼時候 Render Virtual DOM?
ReactDOM.render
通常整個 APP 只會有一個
component.setState
// render api example
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
// setState api example
this.setState({greetings: 'Hello World'});不知道啥 data 改變,每個都檢查過就知道了
AngularJS
Angular
才不管啥 data 改變,全部重 render 就對了
React
我知道啥 data 改變了,因為被改變時會收到通知
Vue
機制:
使用 Data 內部的提供 getter & setter
Object.defineProperty
Data 被 get 時,會把 get 他的 watcher 當成 subscriber
Data 被 set 時,會 notify 他的 subscribers
watcher 觸發 virtual DOM 的 render
<h1>Hello {{yourName}}!</h1>要觀察哪些 data?
API:
new Vue
<h1>Hello {{yourName}}!</h1>
var vm = new Vue({
el: '#app2',
data: {
yourName: 'Henry'
},
});不知道啥 data 改變,每個都檢查過就知道了
AngularJS
Angular
才不管啥 data 改變,全部重 render 就對了
React
我知道啥 data 改變了,因為被改變時會收到通知
Vue