今天小編給大家分享一下Vue2.0如何實(shí)現(xiàn)雙向綁定的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
公司主營業(yè)務(wù):網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出甘南免費(fèi)做網(wǎng)站回饋大家。
一、實(shí)現(xiàn)雙向綁定的做法
前端MVVM最令人激動(dòng)的就是雙向綁定機(jī)制了,實(shí)現(xiàn)雙向數(shù)據(jù)綁定的做法大致有如下三種:
1.發(fā)布者-訂閱者模式(backbone.js)
思路:使用自定義的data屬性在HTML代碼中指明綁定。所有綁定起來的JavaScript對象以及DOM元素都將“訂閱”一個(gè)發(fā)布者對象。任何時(shí)候如果JavaScript對象或者一個(gè)HTML輸入字段被偵測到發(fā)生了變化,我們將代理事件到發(fā)布者-訂閱者模式,這會(huì)反過來將變化廣播并傳播到所有綁定的對象和元素。
2.臟值檢查(angular.js)
思路:angular.js 是通過臟值檢測的方式比對數(shù)據(jù)是否有變更,來決定是否更新視圖,最簡單的方式就是通過 setInterval() 定時(shí)輪詢檢測數(shù)據(jù)變動(dòng),angular只有在指定的事件觸發(fā)時(shí)進(jìn)入臟值檢測,大致如下:
DOM事件,譬如用戶輸入文本,點(diǎn)擊按鈕等。( 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()來劫持各個(gè)屬性的setter,getter,在數(shù)據(jù)變動(dòng)時(shí)發(fā)布消息給訂閱者,觸發(fā)相應(yīng)的監(jiān)聽回調(diào)。
由此可見,Object.defineProperty() 這個(gè)API是Vue實(shí)現(xiàn)雙向數(shù)據(jù)綁定的關(guān)鍵,我們先簡單了解下這個(gè)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';
如果去掉 obj.hello=‘111' 這行代碼,則get的返回值val會(huì)報(bào)錯(cuò)val is not defined??梢奜bject.defineProperty() 監(jiān)控對數(shù)據(jù)的操作,可以自動(dòng)觸發(fā)數(shù)據(jù)同步。下面我們先用Object.defineProperty()來實(shí)現(xiàn)一個(gè)非常簡單的雙向綁定。
三、實(shí)現(xiàn)簡單的雙向綁定
最簡單例子: