淺談Vue的雙向數(shù)據(jù)綁定原理

Vue作為目前最火的框架之一,對于它的雙向數(shù)據(jù)綁定原理很多人都會有些疑惑蛙吏,今天在這邊兄一,我用比較淺顯洲赵、易理解的小例子來給大家的簡單的講解一下鸳惯。

vue數(shù)據(jù)雙向綁定原理

先來看一下數(shù)據(jù)雙向綁定的一個效果來初步感受一下它的神奇之處。

<body>
    <div id="app">
        <input type="text" v-model="msg"> 
        <!-- v-model屬于表單輸入的一個指令叠萍,實質(zhì)是一個屬性悲敷,屬性值是一個變量 -->
        {{ msg }}  
        <!-- 數(shù)據(jù)綁定最常見的形式-Mustache語法的文本差值,{{}}將會被替換成對應(yīng)數(shù)據(jù)對象上msg的值 -->
    </div>
</body>
<script src="vue.js"></script>
<script >
    new Vue({
        el:"#app",  //找到要使用Vue語法的DOM節(jié)點
        data:{      //初始化的數(shù)據(jù)
            msg:"hello vue"  //定義了msg的值
        }
    })
</script>

整體效果參考下圖(此圖不是上述代碼效果)


image

下面探討一下原理俭令。
vue數(shù)據(jù)雙向綁定是通過 數(shù)據(jù)劫持 結(jié)合 發(fā)布者-訂閱者模式 的方式來實現(xiàn)的.
首先來看一下數(shù)據(jù)劫持-數(shù)據(jù)劫持的實現(xiàn)方式 Object.defineProperty()后德。

Object.defineProperty()

Object.defineProperty()方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性抄腔,并且返回這個對象瓢湃。
語法 Object.defineProperty(obj,prop,descriptor)
obj:要在其上定義屬性的對象
prop:要定義或者修改的屬性的名稱
descriptor:將被定義或修改的屬性描述符
返回值:被傳遞給函數(shù)的對象

如果上述解釋仍然不明白,下面我們看下Object.defineProperty()方法的具體使用案例

<script>
    var Book = {name:"java權(quán)威指南"};
    console.log(Book.name);
    let val;
    Object.defineProperty(Book,"name",{
        set(value){
            val=value;
        },
        get(){
            console.log(val);           //打印這里的值可以看出赫蛇,val被修改了绵患。
            return val;                //這里就是返回值
        }
    })
    console.log(Book);
    Book.name="HTML5權(quán)威指南";    //這里調(diào)用了set方法,這里實際上將“html5權(quán)威指南作為參數(shù)value”傳入了set方法并賦值給了val悟耘;
    console.log(Book.name);    //這里調(diào)用了get方法落蝙,獲取了修改后的val的值
</script>
image.png

運行結(jié)果如上:最終Book對象上的name屬性通過get,set方法就成功的進(jìn)行了修改暂幼》だ眨看到第22行的輸出結(jié)果也可以看出,val的值被修改傳遞旺嬉。
查看Book對象也會發(fā)現(xiàn)上面綁定了get和set方法管行。

利用Object.defineProperty()的這個特點,當(dāng)你把一個普通的 JavaScript 對象傳入 Vue 實例作為 data 選項邪媳,Vue 將遍歷此對象所有的屬性捐顷,并使用 Object.defineProperty 把這些屬性全部轉(zhuǎn)為 getter/setter。
我們可以先來看一下通過控制臺輸出一個定義在vue初始化數(shù)據(jù)上的對象是個什么東西雨效。是否這個vue對象如上述所說擁有g(shù)et和set方法迅涮。

<script src="vue.js"></script>
<script>
    var vm=new Vue({
        data:{
            obj:{
                a:1
            }
        },
        created: function () {
            console.log(this.obj);
        }
    })
</script>
image.png

我們可以看到屬性a有兩個相對應(yīng)的get和set方法,為什么會多出這兩個方法呢徽龟?因為vue是通過上述講的Object.defineProperty()來實現(xiàn)數(shù)據(jù)劫持的叮姑。

發(fā)布-訂閱者模式

又叫觀察者模式,它定義了一對多的關(guān)系顿肺,讓多個觀察者可以同時監(jiān)聽一個對象戏溺。
它的最主要的思想:這個對象狀態(tài)變化時就會通過所有的觀察者對象,使得它們能夠自動更新屠尊。
最上面的雙向綁定案例的思想簡單分析:
vue內(nèi)部通過Object.defineProperty( )對屬性設(shè)置一個set函數(shù)旷祸,當(dāng)input中輸入的值發(fā)生了改變了就會來觸發(fā)這個函數(shù),然后得到新的msg的值通過{{}}將新得到的msg值反應(yīng)到頁面上讼昆。

最基礎(chǔ)的理解就在上方托享,如果還要更深層次的理解還要對原理圖去理解,下面我會放一張原理圖浸赫,大家如果學(xué)有余力可以再去學(xué)習(xí)哦~


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闰围,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子既峡,更是在濱河造成了極大的恐慌羡榴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运敢,死亡現(xiàn)場離奇詭異校仑,居然都是意外死亡,警方通過查閱死者的電腦和手機传惠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門迄沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卦方,你說我怎么就攤上這事羊瘩。” “怎么了盼砍?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵尘吗,是天一觀的道長。 經(jīng)常有香客問我浇坐,道長摇予,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任吗跋,我火速辦了婚禮侧戴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跌宛。我一直安慰自己酗宋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布疆拘。 她就那樣靜靜地躺著蜕猫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哎迄。 梳的紋絲不亂的頭發(fā)上回右,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天隆圆,我揣著相機與錄音,去河邊找鬼翔烁。 笑死渺氧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬屹。 我是一名探鬼主播侣背,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慨默!你這毒婦竟也來了贩耐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤厦取,失蹤者是張志新(化名)和其女友劉穎潮太,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虾攻,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡消别,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了台谢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寻狂。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朋沮,靈堂內(nèi)的尸體忽然破棺而出蛇券,到底是詐尸還是另有隱情,我是刑警寧澤樊拓,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布纠亚,位于F島的核電站,受9級特大地震影響筋夏,放射性物質(zhì)發(fā)生泄漏蒂胞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一条篷、第九天 我趴在偏房一處隱蔽的房頂上張望骗随。 院中可真熱鬧,春花似錦赴叹、人聲如沸鸿染。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涨椒。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚕冬,已是汗流浹背免猾。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留囤热,地道東北人猎提。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像赢乓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子石窑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容