目錄
- 序言
- 單向資料繫結 vs 雙向資料繫結
- 單向資料流 vs 雙向資料流
- 資料流與資料繫結
- 參考
1. 序言
在前端三大主流的框架中,我們可能會經常聽到 React 是單向資料流,採用單向資料繫結,而 Vue 2.x 也是單向資料流,但同時支援單向資料繫結和雙向資料繫結,而 Angular 和 AngularJS 又有所不同,到底資料繫結與資料流之間有什麼關聯?單向資料繫結就等價於單向資料流嗎?支援雙向資料繫結就一定是雙向資料流嗎?這篇文章將理清在前端三大框架中資料繫結與資料流之間的關聯與區別。
注:若以下文章中沒有特別指明 Vue 的版本,預設代表 Vue 2.x 。Angular 一般意義上是指 Angular 2 及以上版本,而 AngularJS 專指 Angular 的所有 1.x 版本。
2. 單向資料繫結 vs 雙向資料繫結
所謂資料繫結,就是指
View
層和Model
層之間的對映關係。
單向資料繫結:Model
的更新會觸發View
的更新,而View
的更新不會觸發Model
的更新,它們的作用是單向的。
雙向資料繫結:Model
的更新會觸發View
的更新,View
的更新也會觸發Model
的更新,它們的作用是相互的。
React 採用單向資料繫結
當使用者訪問View
時,通過觸發Events
進行互動,而在相應Event Handlers
中,會觸發對應的 Actions
,而Actions
通過呼叫 setState
方法對View
的 State
進行更新,State
更新後會觸發View
的重新渲染。
可以看出,在 React 中,View
層是不能直接修改 State
,必須通過相應的 Actions
來進行操作。
單向數繫結的優缺點:
優點:所有狀態變化都可以被記錄、跟蹤,狀態變化通過手動呼叫觸發,源頭易追溯。
缺點:會有很多類似的樣板程式碼,程式碼量會相應的上升。
Vue 支援單向資料繫結和雙向資料繫結
- 單向資料繫結:使用
v-bind
屬性繫結、v-on
事件繫結或插值形式{{data}}
。 - 雙向資料繫結:使用
v-model
指令,使用者對View
的更改會直接同步到Model
。
Vue 的雙向資料繫結就是指使用v-model
指令進行資料繫結,而v-model
本質上是v-bind
和v-on
相組合的語法糖,是框架自動幫我們實現了更新事件。換句話說,我們完全可以採取單向繫結,自己實現類似的雙向資料繫結。
雙向數繫結的優缺點:
優點:在操作表單時使用v-model
方便簡單,可以省略繁瑣或重複的onChange
事件去處理每個表單資料的變化(減少程式碼量)。
缺點:屬於暗箱操作,無法追蹤區域性狀態的變化。
Angular 支援單向資料繫結和雙向資料繫結
- 單向資料繫結:使用
[x]
屬性繫結、(x)
事件繫結或插值形式{{data}}
。 - 雙向資料繫結:使用
[(x)]
語法,使用者對View
的更改會直接同步到Model
。
除了語法上有所不同,Angular 雙向資料繫結與 Vue 類似,也是語法糖,[(x)]
語法結合了屬性繫結 [x]
和事件繫結 (x)
。
AngularJS 支援單向資料繫結和雙向資料繫結
- 單向資料繫結:使用
ng-bind
指令或插值形式{{data}}
。 - 雙向資料繫結:使用
ng-model
指令,使用者對View
的更改會直接同步到Model
。
AngularJS 的雙向資料繫結實現原理與 Angular 完全不同,其實現原理可以參考這篇文章。
3. 單向資料流 vs 雙向資料流
所謂資料流,就是指的是元件之間的資料流動。
React、Vue 以及 Angular 都只是單向資料流
雖然 Vue 和 Angular 有雙向資料繫結,但 Vue 和 Angualr 父子元件之間資料傳遞,仍然遵循單向資料流,即父元件可以向子元件傳遞props
,但是子元件不能修改父元件傳遞來的props
,子元件只能通過事件通知父元件進行資料更改。如下圖所示:
優點:由於元件資料傳遞只有唯一的入口和出口,使得程式更直觀、更容易理解,有利於程式的可維護性。
AngularJS 支援雙向資料流
所謂雙向資料流,就是指在子元件中可以直接更新父元件的資料。
缺點:由於元件資料變化的來源入口變得可能不止一個,如果缺乏相應的“管理”手段,容易將資料流轉方向弄得紊亂。同時也會增加了出錯時 debug 的難度。
4. 資料流與資料繫結
嚴格來說,資料流和資料繫結是兩個概念,並不是同一個東西。單向資料流也可以支援雙向資料繫結,雙向資料流也可以支援單向資料繫結。
簡單總結一下前端三大框架的資料流與資料繫結的區別: