国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

vue 雙向數(shù)據(jù)綁定的實現(xiàn)學(xué)習(xí)(一)

anonymoussf / 983人閱讀

摘要:雙向數(shù)據(jù)綁定簡言之數(shù)據(jù)動頁面動,頁面動,數(shù)據(jù)動典型的應(yīng)用就是在做表單時候,輸入框的內(nèi)容改動后,跟該輸入框的的值改動。看官網(wǎng)上的這個的演示案例雙向數(shù)據(jù)綁定的好處要說出這個好處的時候,也只有在實際場景中才能對應(yīng)的顯示出來。

前言:本系列學(xué)習(xí)筆記從以下幾個點展開

什么是雙向數(shù)據(jù)綁定

雙向數(shù)據(jù)綁定的好處

怎么實現(xiàn)雙向數(shù)據(jù)綁定

實現(xiàn)雙向數(shù)據(jù)數(shù)據(jù)綁定需要哪些知識點

數(shù)據(jù)劫持

發(fā)布訂閱模式

先看看我們要實現(xiàn)的目標是什么,如下動圖:

0、什么是雙向數(shù)據(jù)綁定

  單向數(shù)據(jù)綁定:把Model 綁定到View上,當我們用js修改模型 Model 時候,視圖View上對應(yīng)的內(nèi)容也會改動,這就是 數(shù)據(jù)動,頁面動 。

  雙向數(shù)據(jù)綁定:簡言之 數(shù)據(jù)動 頁面動,頁面動,數(shù)據(jù)動, 典型的應(yīng)用就是在做表單時候,輸入框的內(nèi)容改動后,跟該輸入框的value 的值改動。

 

看vue 官網(wǎng)上的這個V-model 的演示案例:

1、雙向數(shù)據(jù)綁定的好處

  要說出這個好處的時候,也只有在實際場景中才能對應(yīng)的顯示出來。比如我們需要實時顯示數(shù)據(jù),我們一邊說話,一邊實時顯示我們說的話的文字內(nèi)容,等等。這讓我想起了去年參加云棲大會,臺上的大佬一邊說話,下面的字幕實時更新。(當然實現(xiàn)這個技術(shù)有很多技術(shù)點,我們不討論這個內(nèi)容,小編也才疏學(xué)淺,搞不懂)

以上的都是廢話,我們直接看看怎么實現(xiàn)這個雙向數(shù)據(jù)綁定。

一、實現(xiàn)原理

  Vue實現(xiàn)雙向數(shù)據(jù)綁定的原理:數(shù)據(jù)劫持 + 發(fā)布訂閱模式(有的也稱為觀察者模式)

  數(shù)據(jù)劫持的核心技術(shù): Object.defineProperty()

  vue 3.0 已經(jīng)用的不是這個技術(shù)了,采用是 原生的 Proxy,據(jù)說速度能夠提升100%,截張尤大的ppt,** 2018-11-21 修改本篇筆記

(香菇,剛研究會一點,就立馬變了,這就是前端世界),Proxy 的方式將會在本系列筆記結(jié)束后,再記錄這個技術(shù)點的使用

二、數(shù)據(jù)劫持的方法 Object.defineProperty()

  先上一個參照代碼,它長這個樣子:

var book = {
 _year: 2004,
 edition: 1
};
Object.defineProperty(book, "year", {
 get: function(){
   console.log("訪問year了,返回_year")
   return this._year;
 },
 set: function(newValue){
   if (newValue > 2004) {
     this._year = newValue;
     console.log("重新設(shè)置_year了,并返回edition")
     this.edition += newValue - 2004;
   }
 }
});
book.year = 2005;
alert(book.edition); //2 

---摘自 JavaScript高級程序設(shè)計

  Object.defineProperty() 的具體介紹,我們本文不做具體展開,查看我這里的一篇文章,Object.defineProperty。 我們這里先要知道這么一個事情。這個方法要傳入三個參數(shù),傳入的數(shù)據(jù)對象data,屬性key,描述符對象。其中,描述符(descriptor)對象的屬 性必須是:configurable、enumerable、writable 和 value。設(shè)置其中的一或多個值,可以修改 對應(yīng)的特性值。我們需要用的是這訪問器屬性。當我們在讀取訪問器屬性時,會調(diào)用 getter 函數(shù),這個函數(shù)負責返回有效的值;在寫入訪問器屬性時,會調(diào)用 setter 函數(shù)并傳入新值,這個函數(shù)負責決定如何處理數(shù)據(jù)。上文代碼上的 get 方法,在讀取屬性時調(diào)用的函數(shù),set方法,在寫入屬性時調(diào)用的函數(shù)。

三、發(fā)布訂閱者模式

  我畫了一個圖,來理解這個模式,如下圖:
  

代碼解釋:

    //下面封裝一個單例模式,內(nèi)容是發(fā)布訂閱模式
let event = {
    eventList: [],
    listener: function (key, fn) {
        if (!this.eventList[key]) { //沒有訂閱過此類消息,創(chuàng)建一個緩存列表
            this.eventList[key] = [];
        }
        this.eventList[key].push(fn)
    },
    trigger: function () {
        let key = Array.prototype.shift.call(arguments); // marry
        let fns = this.eventList[key];
        if (!fns || fns.length == 0) { //沒有訂閱 則返回
            return false;
        }
        for (let i = 0, fn; fn = fns[i++];) {
            fn.apply(this, arguments)
            // 調(diào)用 event.listen 里面的 fn 方法,通過apply將當前執(zhí)行的對象指向當前的this,arguments 傳進 fn 函數(shù)
        }
    },
    remove: function (key, fn) { // 取消訂閱
        let fns = this.eventList[key];
        if (!fns) {
            return false;
        }
        if(!fn) {
            fns && (fns.length = 0)
        } else {
            for (let l = fns.length-1; l>=0; l--) {
                let _fn = fns[l];
                if( _fn === fn) {
                    fns.splice(l, 1)
                }
            }
        }
    },
    install: function (obj) {
        for (let i in this) {
            if (i === "install") {
                return false
            }
            obj[i] = this[i];
        }
    }
}


let testMsg = {}
event.install(testMsg)

// 上面方法 就會將event的方法 淺拷貝給 testMsg, 這樣testMsg就有 event的方法和屬性
testMsg.listener("rich", fn1 = (name) => {
    console.log(`${name}知道你有錢了`)
})
testMsg.listener("borrowMoney", fn2 =  (name) => {
    console.log(`${name}想問你借錢`)
})

// listen方法將事件 放進隊列
// testMsg.remove("rich", fn1) // 取消訂閱

// trigger方法,處理事件隊列的方法,調(diào)用listen的函數(shù)的里面的回調(diào)函數(shù) fn
testMsg.trigger("rich", "張三")
testMsg.trigger("rich", "張三2")
testMsg.trigger("borrowMoney", "李四")
testMsg.trigger("borrowMoney", "李四2")



// 代碼總結(jié):
// 訂閱的事件具有對應(yīng)的key
    // 通過listener方法,將具體的事件隊列保存到 eventList ,可以理解為緩存列表也可以是事件隊列;
    // 執(zhí)行trigger 方法,將事件隊列拿出來執(zhí)行調(diào)用
    // remove 方法根據(jù)對應(yīng)的key值,刪除對應(yīng)的訂閱事件
// 模式總結(jié):封裝一個單例event, 執(zhí)行installEvent方法,將想要event對象拷貝到某個對象中去,
// 發(fā)布者trigger方法,監(jiān)聽者listen方法 ,trigger 發(fā)布一個東西,listen立馬知道你要發(fā)布的東西
四、實現(xiàn)分解 主函數(shù)入口
function Myvue (options) {
    this.$options = options
    this.$el = document.querySelector(options.el);
    this.$data = options.data;
    Object.keys(this.$data).forEach(key => {
        this.$prop = key;
    })
    this.init()
}
Myvue.prototype.init = function () {
    // 監(jiān)聽數(shù)據(jù)變化
    observer(this.$data);
            // 獲得值
            // let value = this.$data[this.$prop];
            // 不經(jīng)過模板編譯直接 通知訂閱者更新dom
            // new Watcher(this,this.$prop,value => {
            //     console.log(`watcher ${this.$prop}的改動,要有動靜了`)
            //     this.$el.textContent = value
            // }) 
    //通知模板編譯來執(zhí)行頁面上模板變量替換
    new Compile(this)
}
主函數(shù)調(diào)用

監(jiān)聽器

訂閱者

模板編譯器

未完待續(xù),錯誤之處,敬請指出,共同進步!

下一篇 vue 雙向數(shù)據(jù)綁定的實現(xiàn)學(xué)習(xí)(二)-監(jiān)聽器的實現(xiàn)

文章參考:

  https://www.cnblogs.com/beeve...

  https://github.com/youngwind/...

  https://juejin.im/post/5a9108...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99557.html

相關(guān)文章

  • Vue雙向綁定原理,教你實現(xiàn)雙向綁定

    摘要:儲存訂閱器因為屬性被監(jiān)聽,這一步會執(zhí)行監(jiān)聽器里的方法這一步我們把也給弄了出來,到這一步我們已經(jīng)實現(xiàn)了一個簡單的雙向綁定了,我們可以嘗試把兩者結(jié)合起來看下效果。總結(jié)本文主要是對雙向綁定原理的學(xué)習(xí)與實現(xiàn)。 當今前端天下以 Angular、React、vue 三足鼎立的局面,你不選擇一個陣營基本上無法立足于前端,甚至是兩個或者三個陣營都要選擇,大勢所趨。 所以我們要時刻保持好奇心,擁抱變化,...

    Labradors 評論0 收藏0
  • 學(xué)習(xí)MVVM及框架雙向綁定筆記

    摘要:的數(shù)據(jù)劫持版本內(nèi)部使用了來實現(xiàn)數(shù)據(jù)與視圖的雙向綁定,體現(xiàn)在對數(shù)據(jù)的讀寫處理過程中。這樣就形成了數(shù)據(jù)的雙向綁定。 MVVM由以下三個內(nèi)容組成 View:視圖模板 Model:數(shù)據(jù)模型 ViewModel:作為橋梁負責溝通View和Model,自動渲染模板 在JQuery時期,如果需要刷新UI時,需要先取到對應(yīng)的DOM再更新UI,這樣數(shù)據(jù)和業(yè)務(wù)的邏輯就和頁面有強耦合。 在MVVM中,U...

    VioletJack 評論0 收藏0
  • Vue原理】VModel - 白話版

    摘要:執(zhí)行的時候,會綁定上下文對象為組件實例于是中的就能取到組件實例本身,的代碼塊頂層作用域就綁定為了組件實例于是內(nèi)部變量的訪問,就會首先訪問到組件實例上。其中的獲取,就會先從組件實例上獲取,相當于。 寫文章不容易,點個贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【2.5.17】 如果你覺得...

    keke 評論0 收藏0
  • vue.js源碼 - 剖析observer,dep,watch三者關(guān)系 如何具體實現(xiàn)數(shù)據(jù)雙向綁定

    摘要:雙向數(shù)據(jù)綁定的核心和基礎(chǔ)是其內(nèi)部真正參與數(shù)據(jù)雙向綁定流程的主要有和基于和發(fā)布者訂閱者模式,最終實現(xiàn)數(shù)據(jù)的雙向綁定。在這里把雙向數(shù)據(jù)綁定分為兩個流程收集依賴流程依賴收集會經(jīng)過以上流程,最終數(shù)組中存放列表,數(shù)組中存放列表。 Vue雙向數(shù)據(jù)綁定的核心和基礎(chǔ)api是Object.defineProperty,其內(nèi)部真正參與數(shù)據(jù)雙向綁定流程的主要有Obderver、Dep和Watcher,基于d...

    mo0n1andin 評論0 收藏0
  • 學(xué)習(xí)Vue.js-Day1

    摘要:學(xué)習(xí)內(nèi)容,基本語法和概念,打包工具,實戰(zhàn)操作參考文獻官網(wǎng)官方資料庫全家桶全家桶文檔概念前端框架借助可以實現(xiàn)手機開發(fā)前端框架是一套構(gòu)造用戶界面的框架,只關(guān)于視圖層前端的主要工作室跟用戶界面打交道,中的,實現(xiàn)界面效果框架是為了提高開發(fā) 學(xué)習(xí)內(nèi)容 1,Vue基本語法和概念 2, 打包工具 Webpack , Gulp3,實戰(zhàn)操作 參考文獻:官網(wǎng): https://cn.vuejs.org...

    Cheriselalala 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<