Day 51/100 Vue雙向綁定原理及相關(guān)知識(shí)鏈接

寫在前面的話

面多了庞瘸,問題五花八門捧弃,但也有一些規(guī)律,比如擦囊,今兒的題就是澄ハ迹考題~

(一)Vue的雙向綁定原理

實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,首先要對(duì)數(shù)據(jù)進(jìn)行劫持監(jiān)聽瞬场,所以我們需要設(shè)置一個(gè)監(jiān)聽器Observer买鸽,用來監(jiān)聽所有屬性。如果屬性發(fā)上變化了泌类,就需要告訴訂閱者Watcher看是否需要更新癞谒。因?yàn)橛嗛喺呤怯泻芏鄠€(gè)底燎,所以我們需要有一個(gè)消息訂閱器Dep來專門收集這些訂閱者,然后在監(jiān)聽器Observer和訂閱者Watcher之間進(jìn)行統(tǒng)一管理的弹砚。接著双仍,我們還需要有一個(gè)指令解析器Compile,對(duì)每個(gè)節(jié)點(diǎn)元素進(jìn)行掃描和解析桌吃,將相關(guān)指令對(duì)應(yīng)初始化成一個(gè)訂閱者Watcher朱沃,并替換模板數(shù)據(jù)或者綁定相應(yīng)的函數(shù),此時(shí)當(dāng)訂閱者Watcher接收到相應(yīng)屬性的變化茅诱,就會(huì)執(zhí)行對(duì)應(yīng)的更新函數(shù)逗物,從而更新視圖。因此接下去我們執(zhí)行以下3個(gè)步驟瑟俭,實(shí)現(xiàn)數(shù)據(jù)的雙向綁定:

1.實(shí)現(xiàn)一個(gè)監(jiān)聽器Observer翎卓,用來劫持并監(jiān)聽所有屬性,如果有變動(dòng)的摆寄,就通知訂閱者失暴。

2.實(shí)現(xiàn)一個(gè)訂閱者Watcher,可以收到屬性的變化通知并執(zhí)行相應(yīng)的函數(shù)微饥,從而更新視圖逗扒。

3.實(shí)現(xiàn)一個(gè)解析器Compile,可以掃描和解析每個(gè)節(jié)點(diǎn)的相關(guān)指令欠橘,并根據(jù)初始化模板數(shù)據(jù)以及初始化相應(yīng)的訂閱器矩肩。




vm.$set()原理

受現(xiàn)代 JavaScript 的限制 (而且 Object.observe 也已經(jīng)被廢棄),Vue 無法檢測(cè)到對(duì)象屬性的添加或刪除肃续。由于 Vue 會(huì)在初始化實(shí)例時(shí)對(duì)屬性執(zhí)行 getter/setter 轉(zhuǎn)化黍檩,所以屬性必須在 data 對(duì)象上存在才能讓 Vue 將它轉(zhuǎn)換為響應(yīng)式的。

對(duì)于已經(jīng)創(chuàng)建的實(shí)例痹升,Vue 不允許動(dòng)態(tài)添加根級(jí)別的響應(yīng)式屬性建炫。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套對(duì)象添加響應(yīng)式屬性疼蛾。

vm.$set()在new Vue()時(shí)候就被注入到Vue的原型上肛跌。

vm.$set()解決了什么問題? 避免濫用

在Vue.js里面只有data中已經(jīng)存在的屬性才會(huì)被Observe為響應(yīng)式數(shù)據(jù), 如果你是新增的屬性是不會(huì)成為響應(yīng)式數(shù)據(jù), 因此Vue提供了一個(gè)api(vm.$set)來解決這個(gè)問題。



數(shù)據(jù)響應(yīng)式原理

vue數(shù)據(jù)雙向綁定是通過數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式來實(shí)現(xiàn)的察郁,

那么vue是如果進(jìn)行數(shù)據(jù)劫持的衍慎??皮钠?

1)vue2.0版本是利用了Object.defineProperty()這個(gè)方法重新定義對(duì)象獲取屬性值的get和設(shè)置屬性值set的操作來實(shí)現(xiàn)的稳捆。

2)vue3.0版本采用了Es6的Proxy對(duì)象來實(shí)現(xiàn)。


Object.defineProperty的缺點(diǎn) :不能監(jiān)聽到數(shù)組變化

由于 JavaScript 的限制麦轰,Vue 不能檢測(cè)以下變動(dòng)的數(shù)組:

當(dāng)你直接設(shè)置一個(gè)項(xiàng)的索引時(shí), 例如: vm.items[indexOfItem] = newValue

當(dāng)你修改數(shù)組的長(zhǎng)度時(shí), 例如: vm.items.length = newLength

無法監(jiān)控到數(shù)組下標(biāo)的變化乔夯,導(dǎo)致直接通過數(shù)組的下標(biāo)給數(shù)組設(shè)置值砖织,不能實(shí)時(shí)響應(yīng)。

https://www.cnblogs.com/YikaJ/p/4278255.html

所以vue才設(shè)置了7個(gè)變異數(shù)組(push末荐、pop侧纯、shift、unshift甲脏、splice眶熬、sort、reverse)的 hack 方法來解決問題块请。

只能劫持對(duì)象的屬性,因此我們需要對(duì)每個(gè)對(duì)象的每個(gè)屬性進(jìn)行遍歷娜氏。如果能直接劫持一個(gè)對(duì)象,就不需要遞歸 + 遍歷了


為什么vue3中改用proxy

1)defineProperty只能監(jiān)聽某個(gè)屬性墩新,不能對(duì)全對(duì)象監(jiān)聽贸弥,所以可以省去for in 提升效率

2)可以監(jiān)聽數(shù)組,不用再去單獨(dú)對(duì)數(shù)組做操作

3)Proxy只是代理了原對(duì)象抖棘,不會(huì)污染原對(duì)象

那么茂腥,在vue中從一個(gè)數(shù)據(jù)到發(fā)生改變的過程是什么?


MVVM和MVC的區(qū)別

MVC全名是Model View Controller切省,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計(jì)典范帕胆,用一種業(yè)務(wù)邏輯朝捆、數(shù)據(jù)、界面顯示分離的方法組織代碼懒豹,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面芙盘,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯脸秽。MVC被獨(dú)特的發(fā)展起來用于映射傳統(tǒng)的輸入儒老、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中。

幾乎所有的App都只干這么一件事:將數(shù)據(jù)展示給用戶看记餐,并處理用戶對(duì)界面的操作驮樊。

MVC的思想:一句話描述就是Controller負(fù)責(zé)將Model的數(shù)據(jù)用View顯示出來,換句話說就是在Controller里面把Model的數(shù)據(jù)賦值給View片酝。


MVVM

什么是MVVM

MVVM:Model囚衔、View、ViewModel雕沿。

你會(huì)下意識(shí)地把它和MVC來對(duì)比练湿,你會(huì)發(fā)現(xiàn),MVVM多了一個(gè)ViewModel而少了Controller审轮。

首先說一下多出來的ViewModel(VM肥哎,不是顯存)辽俗。

VM的意義,和Model一樣篡诽,在于數(shù)據(jù)榆苞。

Model負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行取和存,然而我們對(duì)數(shù)據(jù)的操作除了取和存以外霞捡,還有一個(gè)非常重要的操作:解析坐漏。



參考鏈接:

cnblogs.com/renzm0318/p/12289415.html

https://www.cnblogs.com/chenhuichao/p/10818396.html

https://www.cnblogs.com/canfoo/p/6891868.html

http://www.reibang.com/p/77eaaf34e732

https://blog.csdn.net/qq_42068550/article/details/89480350

https://www.cnblogs.com/webcabana/p/11077628.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碧信,隨后出現(xiàn)的幾起案子赊琳,更是在濱河造成了極大的恐慌,老刑警劉巖砰碴,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏筏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡呈枉,警方通過查閱死者的電腦和手機(jī)趁尼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猖辫,“玉大人酥泞,你說我怎么就攤上這事】性鳎” “怎么了芝囤?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辛萍。 經(jīng)常有香客問我悯姊,道長(zhǎng),這世上最難降的妖魔是什么贩毕? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任悯许,我火速辦了婚禮,結(jié)果婚禮上辉阶,老公的妹妹穿的比我還像新娘先壕。我一直安慰自己,他們只是感情好睛藻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布启上。 她就那樣靜靜地躺著,像睡著了一般店印。 火紅的嫁衣襯著肌膚如雪冈在。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天按摘,我揣著相機(jī)與錄音包券,去河邊找鬼纫谅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛溅固,可吹牛的內(nèi)容都是我干的付秕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼侍郭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼询吴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亮元,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤猛计,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后爆捞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奉瘤,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年煮甥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盗温。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡成肘,死狀恐怖卖局,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艇劫,我是刑警寧澤吼驶,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站店煞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏风钻。R本人自食惡果不足惜顷蟀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骡技。 院中可真熱鬧鸣个,春花似錦、人聲如沸布朦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)是趴。三九已至涛舍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唆途,已是汗流浹背富雅。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工掸驱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人没佑。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓毕贼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛤奢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鬼癣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348