Vue雙向綁定實例教程

Vue雙向綁定實例教程

雙向綁定簡介

我們知道Vue是一個典型的MVVM框架,Vue在動態(tài)綁定這一塊提供了豐富的API帝雇,讓我們可以用簡短的代碼寫出響應(yīng)式的效果,我們只需關(guān)注數(shù)據(jù)對象,而視圖層則通過雙向綁定的形式進(jìn)行更新春宣,以下將通過四個方面介紹雙向綁定在vue的使用及可能遇到的坑

  1. 雙向綁定在實際項目中的運用
  2. 借助Vue調(diào)試工具定位問題
  3. 雙向綁定與Getter/Setter器的關(guān)系,深入響應(yīng)式原理
  4. 綁定失敗問題的解決方案

雙向綁定在項目的實際運用

在項目中,我們對element-ui做了一次再封裝處理辉懒,以表單組件為例
在業(yè)務(wù)使用中很大的痛點在于表單各個不同組件的使用,在Jquery中,我們對不同的表單控件需要使用不同的取值形式,例如多選下拉和單選下拉玩徊、日期控件和范圍日期控件,取值邏輯不盡相同琼了,針對這種問題

我們創(chuàng)建了一個pm_form_item組件統(tǒng)一化處理 如下圖


image.png

外部通過傳入不同的參數(shù)決定控件的類型及邏輯逻锐,外部只關(guān)注綁定對象,無須關(guān)注取值設(shè)值的過程,未來拓展的過程中雕薪,假如有新的表單控件昧诱,只需增加新的參數(shù)類型,而對外部隱藏實現(xiàn).

接下來就嘗試新增一個表單組件試試吧蹦哼!


image.png

設(shè)置組件的行數(shù)鳄哭、寬度及控件類型等參數(shù)要糊,設(shè)置是否可讀,設(shè)置屬性名,這里我們期望這個控件的值綁定到formModel的createTime屬性上
觀察下效果吧纲熏!


image.png

看起來好像一切順利,現(xiàn)在我們可以進(jìn)行業(yè)務(wù)開發(fā)了

假如這是一個新增頁面锄俄,我期望在打開這個頁面的時候給這個控件一個默認(rèn)值局劲,這似乎聽起來并不難,只需要對formModel.createTime初始化值即可,如下 (created為Vue內(nèi)置生命周期函數(shù))


image.png

觀察一下現(xiàn)象


image.png

默認(rèn)值的確已經(jīng)被初始化完成,但當(dāng)我們想要再次修改控件的值時卻失敗了奶赠,這個控件現(xiàn)在對任何的輸入值都不生效鱼填。雙向綁定詭異的失敗了。下面一節(jié)將介紹Vue的調(diào)試插件定位我們遇到的這個問題.

Vue調(diào)試工具 - Vue Devtools

Vue Devtools是Vue官方出品的一款Vue的調(diào)試工具毅戈,使用是通過Chrome的插件進(jìn)行的苹丸,這里對安裝插件等準(zhǔn)備工作不做贅述


image.png

這里是Vue使用截圖
總共分為3部分 Components,Vuex,Events
Components中左側(cè)是組件樹,右側(cè)可以看到組件的data,props等苇经,這個界面可以用以監(jiān)控組件的內(nèi)部狀態(tài)赘理,是最常用的功能

Vuex是一個Vue狀態(tài)管理功能,我們可以在這里看到有關(guān)Vuex里的一些信息類似 state ,getters 等

Event界面我們可以看到Vue的事件觸發(fā),鼠標(biāo)的點擊移出移入輸入等事件扇单,都可以在這里看到

針對上述問題
我們觀察Event,每次選擇輸入值時都會觸發(fā)pick事件商模,我們可以看到我們選擇的日期也在此事件參數(shù)中


image.png

看起來似乎是因為輸入事件回調(diào)沒有正常影響對象的值,我們嘗試寫監(jiān)視器,監(jiān)聽對象的另一個屬性然后打印該變量


image.png

我們拿這個對象與正常場景下的對象進(jìn)行對比,發(fā)現(xiàn)異常場景下的對象少了createTime屬性的getter/setter方法


image.png

看起來這就是造成雙向綁定失敗問題的真兇

雙向綁定與Getter/Setter關(guān)系

在說雙向綁定與Getter/Setter器的關(guān)系時施流,我們先講一下Vue雙向綁定實現(xiàn)的基本原理

在傳統(tǒng)認(rèn)知中响疚,雙向綁定通常使用引用傳遞或類似原理完成雙向綁定,但這種方式通常會帶來非常多的問題,子組件如果可以隨意修改父組件的值,對開發(fā)人員是一個很大的心智負(fù)擔(dān)瞪醋,故在現(xiàn)代化的MVVW框架中忿晕,雙向綁定都采用類似事件通知的形式進(jìn)行。

不同于angularJs的 一處監(jiān)聽,全局檢查,Vue使用的是點對點的訂閱綁定模式,當(dāng)子組件的值發(fā)生修改時,觸發(fā)外部傳入的回調(diào)函數(shù)修改外部的值
一個雙向綁定實際的實現(xiàn)類似如下

而v-model關(guān)鍵字是對上述的一種語法糖封裝

通過上述過程我們知道Vue需要在子組件綁定值childValue發(fā)生改變時觸發(fā)回調(diào)函數(shù),所以通過賦值模式進(jìn)行改動是行不通的趟章,需要通過Set方法杏糙,在Set方法中進(jìn)行回調(diào)觸發(fā)事件調(diào)用等,類似下面的偽代碼

value{
    var val;
    get(){
        return this.val;
    }
    set(newVal){
        vue.$emit("parentEvent",newVal);
        this.val = newVal;
    }
}

這個Getter/Setter則是Vue為綁定變量動態(tài)生成的方法,Vue正是通過這種點對點的訂閱行為完成雙向綁定

綁定失敗問題的解決方案

由于我們已經(jīng)定位了問題是由于Setter/Getter問題引起,那么只要讓Vue自己能夠動態(tài)添加或我們自己手動添加即可

1.在聲明formModel的 data對象時聲明createTime屬性


image.png

2.在初始化時不使用賦值初始化蚓土,轉(zhuǎn)用Vue API
這種做法Vue會在賦值時為對象自動生成getter/setter


image.png

回顧我們第一節(jié)的內(nèi)容我們可能會有些疑問宏侍,第一次我們沒有進(jìn)行賦值操作,但我們也沒有對createTime進(jìn)行聲明或初始化getter/setter操作,但為什么結(jié)果是對的呢蜀漆?

我們嘗試在組件渲染完時谅河,打印查看createTime屬性不存在,同時也沒有g(shù)etter/setter确丢,但當(dāng)我們觸發(fā)了子組件的選擇事件后再嘗試打印

此時vue已經(jīng)為formModel對象添加了createTime和getter/setter方法绷耍,看來這個地方只是Vue為我們做了一次貼心的優(yōu)化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鲜侥,隨后出現(xiàn)的幾起案子褂始,更是在濱河造成了極大的恐慌,老刑警劉巖描函,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崎苗,死亡現(xiàn)場離奇詭異,居然都是意外死亡舀寓,警方通過查閱死者的電腦和手機(jī)胆数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來互墓,“玉大人必尼,你說我怎么就攤上這事〈勰欤” “怎么了判莉?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長育谬。 經(jīng)常有香客問我券盅,道長,這世上最難降的妖魔是什么斑司? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任渗饮,我火速辦了婚禮但汞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘互站。我一直安慰自己私蕾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布胡桃。 她就那樣靜靜地躺著踩叭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翠胰。 梳的紋絲不亂的頭發(fā)上容贝,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音之景,去河邊找鬼斤富。 笑死,一個胖子當(dāng)著我的面吹牛锻狗,可吹牛的內(nèi)容都是我干的满力。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼轻纪,長吁一口氣:“原來是場噩夢啊……” “哼油额!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刻帚,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤潦嘶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崇众,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掂僵,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年校摩,在試婚紗的時候發(fā)現(xiàn)自己被綠了看峻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阶淘。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡衙吩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溪窒,到底是詐尸還是另有隱情坤塞,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布澈蚌,位于F島的核電站摹芙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宛瞄。R本人自食惡果不足惜浮禾,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盈电,春花似錦蝴簇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吸重,卻和暖如春互拾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚎幸。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工颜矿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫉晶。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓或衡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親车遂。 傳聞我的和親對象是個殘疾皇子封断,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容舶担。關(guān)于...
    云之外閱讀 5,045評論 0 29
  • 主要還是自己看的坡疼,所有內(nèi)容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/衣陶,類似于 vie...
    Leonzai閱讀 3,329評論 0 25
  • vue概述 在官方文檔中柄瑰,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,191評論 0 25
  • 一:什么是閉包?閉包的用處剪况? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)教沾。在本質(zhì)上,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 9,523評論 1 52
  • 前言 您將在本文當(dāng)中了解到,往網(wǎng)頁中添加數(shù)據(jù),從傳統(tǒng)的dom操作過渡到數(shù)據(jù)層操作,實現(xiàn)同一個目標(biāo),兩種不同的方式....
    itclanCoder閱讀 25,746評論 1 12