一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - vue.js - Vue2.0/3.0雙向數據綁定的實現原理詳解

Vue2.0/3.0雙向數據綁定的實現原理詳解

2022-03-07 15:57大·左 vue.js

這篇文章主要給大家介紹了關于Vue2.0/3.0雙向數據綁定的實現原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Vue2.0/3.0 雙向數據綁定的實現原理

雙向數據綁定簡意 即數據的改變能讓頁面重新渲染

Vue2.0 ES5的原理:

Object.defineProperty 對數據進行攔截

簡單小案例

<body>
    姓名:
    <span id="name"></span>
    <br />
    <input type="text" id="inputName" />
  </body>

改變input框的值 讓span里面的值隨之改變 數據的改變可以讓視圖

 <script>
      let obj ={
          name:""
      }
      Object.defineProperty(obj,"name",{
          get(){
                return this.name    //注意錯誤示范 不可以用this 形成死循環 要準備一個新的值
          },
          set(val){

          }
      })
  </script>

正確寫法

<script>
      let obj = {
      name: ""
    };
    let newObj = JSON.parse(JSON.stringify(obj));
    Object.defineProperty(obj, "name", {
      get() {
        return newObj.name;
      },
      set(val) {
        if (val === newObj.name) return; //增加判斷優化性能 判斷新值與舊值是否一樣 一樣就返回  不一樣的話的再次賦值
        newObj.name = val;
        obServer();
      }
    });
    //   重新賦值的方法
    function obServer() {
      spanName.innerHTML = newObj.name; //獲取obj.name的值
      inputName.value = newObj.name;
    }
    obServer(); //開始就執行一次
    setTimeout(() => {
      obj.name = "大左";
    }, 1000);
  </script>

執行邏輯

1.setTimeout執行1秒后修改數據 觸發obj.name的set(val)

2.拿到最新的值給到newObj.name 執行 obServer()方法

3.拿到最新的值賦值 spanName.innerHTML = newObj.name; inputName.value = newObj.name;

Vue2.0/3.0雙向數據綁定的實現原理詳解

input框的值改變 span框的值隨著改變

inputName.oninput = function() {
      obj.name = this.value;
    };

Vue2.0/3.0雙向數據綁定的實現原理詳解

這個操作在Vue 里面叫v-model

Vue2.0不足之處

1.需要對原始數據進行克隆 不然死循環 上面有提到

2.如果我們想給對象中的數據進行get和set的攔截 就要一個個設置 對象中的屬性都要單獨的監聽一下 如果有多個就要循環遍歷了 分別來監聽了

反看vue2.0中的data

data(){
return{
obj:{}
}
}
this.obj.name="XXX"  //這個操作行不通  因為剛開始的時候obj里面沒有name所以就沒有進行監聽 都是以上第二條造成的

ok 那我們再看一下

3.0的特點以及好處

主要用到了SE6里面的proxy

 <script>
    let obj = {};
    obj = new Proxy(obj, {
      get(target, prop) {
        console.log("D");
        return target[prop];
      },
      set(target, prop, value) {
        console.log("Z");
        target[prop] = value;
      }
    }); //監聽整個對象 不需要指定屬性 相當于把對象里所有的屬性都監聽了 So 直接寫整體的set get
  </script>

1.獲取obj.name 觸發get 這里沒有name 但是可以走 因為沒有值所以返回undefine

Vue2.0/3.0雙向數據綁定的實現原理詳解

2. 設置給name值看一下 觸發set

Vue2.0/3.0雙向數據綁定的實現原理詳解

3.再次獲取obj.name看看有沒有值

Vue2.0/3.0雙向數據綁定的實現原理詳解

So 不管你現在對象里有沒有某個屬性 因為這里監聽的是整個對象 對象里面未來有的都有了 彌補2.0不足之處

1.不需要clone

2.也不需要給每一個對象里面的屬性單獨設置 給整體對象設置就ok了 干凈又衛生啊

再次實現上面2.0的操作

 <script>
    let obj = {};
    obj = new Proxy(obj, {
      get(target, prop) {
        console.log("D");
        return target[prop];
      },
      set(target, prop, value) {
        console.log("Z");
        target[prop] = value;
        obServer();
      }
    }); //監聽整個對象 不需要指定屬性 相當于把對象里所有的屬性都監聽了 So 直接寫整體的set get
    //   重新賦值的方法
    function obServer() {
      spanName.innerHTML = obj.name; //獲取obj.name的值
      inputName.value = obj.name;
    }
    obServer(); //開始就執行一次
    setTimeout(() => {
      obj.name = "大左";
    }, 1000);
    inputName.oninput = function() {
      obj.name = this.value;
    };
  </script>

Vue2.0/3.0雙向數據綁定的實現原理詳解

總結

到此這篇關于Vue2.0/3.0雙向數據綁定的實現原理的文章就介紹到這了,更多相關Vue雙向數據綁定原理內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_46719868/article/details/115829724

延伸 · 閱讀

精彩推薦
  • vue.jsVue項目中實現帶參跳轉功能

    Vue項目中實現帶參跳轉功能

    最近做了一個手機端系統,其中遇到了父頁面需要攜帶參數跳轉至子頁面的問題,現已解決,下面分享一下實現過程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
  • vue.js用vite搭建vue3應用的實現方法

    用vite搭建vue3應用的實現方法

    這篇文章主要介紹了用vite搭建vue3應用的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.jsVue2.x 項目性能優化之代碼優化的實現

    Vue2.x 項目性能優化之代碼優化的實現

    這篇文章主要介紹了Vue2.x 項目性能優化之代碼優化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    優小U9632022-02-21
  • vue.jsVue2.x-使用防抖以及節流的示例

    Vue2.x-使用防抖以及節流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節流的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學的同學,可能js的基礎也不是太牢固,聽起來更是吃力,那我就已個人之淺見,以大白話...

    CRMEB技術團隊7992021-12-22
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
  • vue.jsVue中引入svg圖標的兩種方式

    Vue中引入svg圖標的兩種方式

    這篇文章主要給大家介紹了關于Vue中引入svg圖標的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    十里不故夢10222021-12-31
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下...

    yukiwu6752022-01-25
主站蜘蛛池模板: 亚洲欧美在线观看一区二区 | 2014天堂 | 欧美特黄视频在线观看 | 99久久精品国产一区二区 | 免费在线观看日本 | 亚洲剧情在线 | 菠萝视频污 | 九九艹| 国产草 | 四虎e234hcom| 日韩欧美一区二区不卡 | 欧美三级做爰全过程 | 欧美大片一区二区三区 | 99在线精品视频 | 成人影院在线观看 | 暖暖的视频完整视频韩国免费 | 天天性综合 | 日韩国产成人 | 性欧美高清理论片 | 亚洲男人天堂网站 | 插入逼 | 九九热只有精品 | 男神插曲女生动漫完整版动漫 | 图片专区小说专区卡通动漫 | 国产亚洲女在线线精品 | 欧美另类z0zxi| 91桃色视频 | 韩国久播影院理论片不卡影院 | 我与旗袍老师疯狂床震 | 日本在线观看视频网站 | 午夜AV国产欧美亚洲高清在线 | 欧美成人三级伦在线观看 | 经典WC女厕所里TV | 男人捅女人漫画 | 日本高清免费不卡在线播放 | 拔插拔插成人 | 国产视频在线一区 | chinese老头和老太交hd | 国产全部理论片线观看 | 赤坂丽女医bd无删减在线观看 | 四虎最新免费网址 |