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

Vue原理

defineproperty

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

介紹

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

語(yǔ)法

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

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

value:屬性的值
  writable:如果為false,屬性的值就不能被重寫(xiě),只能為只讀了。
  enumerable:是否能枚舉,也就是否能在for...in循環(huán)中遍歷出來(lái)或在Object.keys中列舉出來(lái)。
  configurable:如果為false,就不能再設(shè)置他的(value,writable,configurable)。

defineProperty訪問(wèn)器,可選鍵值

還有兩個(gè)方法 ,雙向數(shù)據(jù)綁定正是利用了這兩個(gè)方法,即訪問(wèn)器 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屬性的時(shí)候都會(huì)調(diào)用get
      get () {
        // console.log(xx)
        return xx;
      },
      // 每一次在設(shè)置obj的x屬性的時(shí)候都會(huì)調(diào)用一次
      set (newValue) {
        // console.log(newValue);
        xx = newValue;
        console.log(xx);
        // 每一次數(shù)據(jù)更新都要重新設(shè)置DOM
        setAppText();
      }
    })

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

流程 : 斷點(diǎn)測(cè)試,真實(shí)的流程、 對(duì)于get set進(jìn)入環(huán)境的理解

  • 解析html,初始均無(wú)值,div.innerHTML = undefined
  • 進(jìn)入腳本(script),聲明let、const、 const (均為指向,不解析)、var
  • Object.defineProperty() 對(duì)象的方法、不解析、定義或修改對(duì)象屬性、描述符(可枚舉enumerable、可重寫(xiě)、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í)行
  • 點(diǎn)擊之前的一次解析流程 ,=>點(diǎn)擊后觸發(fā)++函數(shù)

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

proxy (ES6)

代理
暫不了解

v-model

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

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

Point:由于v-model只是語(yǔ)法糖,下面三個(gè)作用相同

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

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

  • <input v-bind:value="message" v-on:input="message = $event.target.value" />
  • 簡(jiǎn)寫(xiě)————<input :value="message" @input="message = $event.target.value" />
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容