基本原理
Vue.采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個(gè)屬性的setter和getter,數(shù)據(jù)變動(dòng)時(shí)發(fā)布消息給訂閱者,觸發(fā)相應(yīng)函數(shù)的回調(diào)。
思路整理
要實(shí)現(xiàn)mvvm的雙向綁定,需要實(shí)現(xiàn)如下幾點(diǎn):
1.實(shí)現(xiàn)一個(gè)數(shù)據(jù)監(jiān)聽器Observer,能夠?qū)?duì)象的所有屬性進(jìn)行監(jiān)聽,發(fā)生變化時(shí)拿到最新值通知訂閱者
2.實(shí)現(xiàn)一個(gè)解析器Compile,對(duì)每個(gè)子元素節(jié)點(diǎn)的指令進(jìn)行掃描和解析,根據(jù)模板指令替換數(shù)據(jù),初始化視圖以及綁定相應(yīng)的回調(diào)函數(shù);
3.實(shí)現(xiàn)一個(gè)Watcher,作為Observer和Compile的橋梁,能夠訂閱屬性變動(dòng)的通知,執(zhí)行指令綁定的回調(diào)函數(shù),更新視圖
4.mvvm的入口,整合以上三者
流程圖如下:
分布實(shí)現(xiàn)
1. MVVM.js
function MVVM(options) { this.$options = options || {}; var data = this._data = this.$options.data; var me = this; // 數(shù)據(jù)代理 // 實(shí)現(xiàn) vm.xxx -> vm._data.xxx Object.keys(data).forEach(function(key) { me._proxyData(key); }); // 代理計(jì)算屬性 // 同樣通過Object.defineProperty進(jìn)行劫持 this._initComputed(); observe(data, this); this.$compile = new Compile(options.el || document.body, this) } MVVM.prototype = { $watch: function(key, cb, options) { new Watcher(this, key, cb); } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)頁題目:詳解Vue雙向數(shù)據(jù)綁定原理解析-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article48/iooep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、商城網(wǎng)站、微信公眾號(hào)、網(wǎng)站排名、網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容