這篇文章主要介紹了Vue2.0怎么實現(xiàn)雙向綁定,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
專業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計、網(wǎng)站制作、商城網(wǎng)站建設(shè)、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。一、實現(xiàn)雙向綁定的做法
前端MVVM最令人激動的就是雙向綁定機(jī)制了,實現(xiàn)雙向數(shù)據(jù)綁定的做法大致有如下三種:
1.發(fā)布者-訂閱者模式(backbone.js)
思路:使用自定義的data屬性在HTML代碼中指明綁定。所有綁定起來的JavaScript對象以及DOM元素都將“訂閱”一個發(fā)布者對象。任何時候如果JavaScript對象或者一個HTML輸入字段被偵測到發(fā)生了變化,我們將代理事件到發(fā)布者-訂閱者模式,這會反過來將變化廣播并傳播到所有綁定的對象和元素。
2.臟值檢查(angular.js)
思路:angular.js 是通過臟值檢測的方式比對數(shù)據(jù)是否有變更,來決定是否更新視圖,最簡單的方式就是通過 setInterval() 定時輪詢檢測數(shù)據(jù)變動,angular只有在指定的事件觸發(fā)時進(jìn)入臟值檢測,大致如下:
DOM事件,譬如用戶輸入文本,點擊按鈕等。( ng-click )
XHR響應(yīng)事件 ( $http )
瀏覽器Location變更事件 ( $location )
Timer事件( $timeout , $interval )
執(zhí)行 $digest() 或 $apply()
3.數(shù)據(jù)劫持(Vue.js)
思路: vue.js 則是采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)相應(yīng)的監(jiān)聽回調(diào)。
由此可見,Object.defineProperty() 這個API是Vue實現(xiàn)雙向數(shù)據(jù)綁定的關(guān)鍵,我們先簡單了解下這個API,了解更多戳這里
二、Object.defineProperty()
簡單例子:
var obj = {}; Object.defineProperty(obj, 'hello', { get: function() { console.log('get val:'+ val); return val; }, set: function(newVal) { val = newVal; console.log('set val:'+ val); } }); obj.hello; obj.hello='111';
結(jié)果:
如果去掉 obj.hello=‘111' 這行代碼,則get的返回值val會報錯val is not defined??梢奜bject.defineProperty() 監(jiān)控對數(shù)據(jù)的操作,可以自動觸發(fā)數(shù)據(jù)同步。下面我們先用Object.defineProperty()來實現(xiàn)一個非常簡單的雙向綁定。
三、實現(xiàn)簡單的雙向綁定
最簡單例子: