VUE的原理 原生js實現(xiàn) Vue雙向綁定 v-model詳解

Vue原理

defineproperty

來源 https://www.cnblogs.com/leaf930814/p/6891254.html
節(jié)選

介紹

Object.defineProperty是ES5中的方法,它可以直接在一個對象上定義一個新屬性届垫,或者修改一個對象的現(xiàn)有屬性抄囚, 并返回這個對象。vue.js正式利用這種方法實現(xiàn)數(shù)據(jù)的雙向綁定,以達(dá)到響應(yīng)式的目的辅辩。

語法

Object.defineProperty(object, propertyname, descriptor) //參數(shù)(3個且必須)

參數(shù)詳解
  • object:要在其上添加或修改屬性的對象。
    -propertyname:要定義或修改的屬性的名稱娃圆。(存在修改玫锋,不存在,自定義讼呢,設(shè)置屬性和描述配置)
  • descriptor:將被定義或修改的屬性描述符撩鹿。(可以包含以下屬性,默認(rèn)情況下悦屏, writable节沦, enumerable,configurable值為false)

value:屬性的值
  writable:如果為false础爬,屬性的值就不能被重寫,只能為只讀了甫贯。
  enumerable:是否能枚舉,也就是否能在for...in循環(huán)中遍歷出來或在Object.keys中列舉出來看蚜。
  configurable:如果為false叫搁,就不能再設(shè)置他的(value,writable供炎,configurable)渴逻。

defineProperty訪問器,可選鍵值

還有兩個方法 ,雙向數(shù)據(jù)綁定正是利用了這兩個方法音诫,即訪問器 get()set()

<div id="app"></div>
  <button onclick="setValue()">add</button>
  <script>
    let xx; // 操作的數(shù)據(jù)
    const setAppText = () => {
      document.querySelector("#app").innerHTML = obj.x;
    }

    const setValue = () => {
      xx++;
      // 給obj賦值為增加之后的值
      obj.x = xx;
    }

    var obj = {};
    
    Object.defineProperty(obj, 'x', {
      // 每一次obj取x屬性的時候都會調(diào)用get
      get () {
        // console.log(xx)
        return xx;
      },
      // 每一次在設(shè)置obj的x屬性的時候都會調(diào)用一次
      set (newValue) {
        // console.log(newValue);
        xx = newValue;
        console.log(xx);
        // 每一次數(shù)據(jù)更新都要重新設(shè)置DOM
        setAppText();
      }
    })

    obj.x = 20;
    // setAppText();
  </script>

流程 : 斷點測試惨奕,真實的流程、 對于get set進(jìn)入環(huán)境的理解

  • 解析html竭钝,初始均無值,div.innerHTML = undefined
  • 進(jìn)入腳本(script),聲明let梨撞、const、 const (均為指向蜓氨,不解析)聋袋、var
  • Object.defineProperty() 對象的方法、不解析穴吹、定義或修改對象屬性幽勒、描述符(可枚舉enumerable、可重寫港令、configurable(刪改目標(biāo)屬性))啥容、get/set方法
  • obj.x = 20 設(shè)置obj.x屬性進(jìn)入definedProperty.set=> xx = 20 =>setAppText()
  • setAppText() =>document.querySelector("#app").innerHTML = obj.x;取值操作锈颗,先進(jìn)入definedProperty.get=>return xx =>返回函數(shù)體繼續(xù)執(zhí)行
  • 點擊之前的一次解析流程 ,=>點擊后觸發(fā)++函數(shù)

原生實現(xiàn)函數(shù)處理數(shù)據(jù)咪惠,數(shù)據(jù)顯示在DOM击吱,改變后的數(shù)據(jù)在js中操作。即簡易的雙向綁定

proxy (ES6)

代理
暫不了解

v-model

指令:在表單控件或者組件上創(chuàng)建雙向綁定遥昧。(input, textarea,select)
更新數(shù)據(jù)覆醇,本質(zhì),語法糖炭臭,負(fù)責(zé)監(jiān)聽用戶的輸入事件以更新數(shù)據(jù)(永脓,并對極端情況處理。)

  • v-model 會忽略所有表單元素的 value鞋仍、checked常摧、selected 特性的初始值而總是將 Vue 實例的數(shù)據(jù)作為數(shù)據(jù)來源。你應(yīng)該通過 JavaScript 在組件的 data 選項中聲明初始值威创。
v-model 在內(nèi)部為不同的輸入元素使用不同的屬性并拋出不同的事件:
  • text 和 textarea 元素使用 value 屬性和 input 事件落午;
  • checkbox 和 radio 使用 checked 屬性和 change 事件;
  • select 字段將 value 作為 prop 并將 change 作為事件肚豺。

Point:由于v-model只是語法糖溃斋,下面三個作用相同

  • v-model ————<input v-model="message">

下面兩種解釋雙向綁定: v-bind可以把data數(shù)據(jù)綁定給value, @input把用戶輸入的值在去賦給data,這樣實現(xiàn)了雙向綁定
需要在Vue實例中操作數(shù)據(jù)

  • <input v-bind:value="message" v-on:input="message = $event.target.value" />
  • 簡寫————<input :value="message" @input="message = $event.target.value" />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市详炬,隨后出現(xiàn)的幾起案子盐类,更是在濱河造成了極大的恐慌寞奸,老刑警劉巖呛谜,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枪萄,居然都是意外死亡隐岛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門瓷翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聚凹,“玉大人,你說我怎么就攤上這事齐帚《恃溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵对妄,是天一觀的道長湘今。 經(jīng)常有香客問我,道長剪菱,這世上最難降的妖魔是什么摩瞎? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任拴签,我火速辦了婚禮,結(jié)果婚禮上旗们,老公的妹妹穿的比我還像新娘蚓哩。我一直安慰自己,他們只是感情好上渴,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布岸梨。 她就那樣靜靜地躺著,像睡著了一般稠氮。 火紅的嫁衣襯著肌膚如雪盛嘿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天括袒,我揣著相機(jī)與錄音次兆,去河邊找鬼。 笑死锹锰,一個胖子當(dāng)著我的面吹牛芥炭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恃慧,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼园蝠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痢士?” 一聲冷哼從身側(cè)響起彪薛,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怠蹂,沒想到半個月后善延,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡城侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年易遣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫌佑。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡豆茫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屋摇,到底是詐尸還是另有隱情揩魂,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布炮温,位于F島的核電站火脉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忘分,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一棋枕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妒峦,春花似錦重斑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笛丙,卻和暖如春漾脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胚鸯。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工骨稿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姜钳。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓坦冠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哥桥。 傳聞我的和親對象是個殘疾皇子辙浑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354