最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue 數(shù)據(jù)綁定的原理分析

 更新時間:2020年11月16日 09:34:43   作者:TMaize  
這篇文章主要介紹了Vue 數(shù)據(jù)綁定的原理,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下

原理

其實原理很簡單,就是攔截了Object的get/set方法,在對數(shù)據(jù)進行set(obj.aget=18)時去重現(xiàn)渲染視圖

實現(xiàn)方式有兩種

  • 方式1

定義了同名的get/set就相當于定義了age

 var test = {
   _age: 18,
   get age() {
     console.log('觸發(fā)get');
     //直接會this.age會進入死遞歸的
     return this._age;
   },
   set age(age) {
     console.log('觸發(fā)set');
     this._age = age;
   }
 };

為了讓test不顯示多余的變量,可以把_age定義在外部

 var _age = 18;
 var test = {
   get age() {
     console.log('觸發(fā)get');
     //直接會this.age會進入死遞歸的
     return _age;
   },
   set age(age) {
     console.log('觸發(fā)set');
     _age = age;
   }
 };
  • 方式2

使用這種方式完美的解決了對象內(nèi)包含多余的變量的問題

 function test() {
   var _age = 18;
   Object.defineProperty(this, "age", {
     get: function () {
       console.log('觸發(fā)get');
       return _age;
     },
     set: function (value) {
       console.log('觸發(fā)set')
       _age = value;
     }
   });
 }
 var t = new test();
 t.age=18;

實現(xiàn)數(shù)據(jù)到視圖的綁定

這里的渲染只是一個簡單的正則替換

要實現(xiàn)Vue那么強大的功能還要自己實現(xiàn)一個模板引擎

<div id="test">
  <p>name:</p>
  <p>age:</p>
</div>
function Element(id, initData) {
  var self = this;
  var el = document.getElementById(id);
  var templet = el.innerHTML;
  var _data = null;

  if (initData) {
    _data = {};
    for (var variable in initData) {
      _data[variable] = initData[variable];
      bind(variable, self);
    }
  }

  function bind(variable, obj) {
    Object.defineProperty(self, variable, {
      set: function (value) {
        //使用_data里的數(shù)據(jù),避免死遞歸
        _data[variable] = value;
        //每次被設(shè)置新值的時候重新渲染界面
        render();
      },
      get: function () {
        return _data[variable];
      },
    });
  }

  //渲染
  function render() {
    var temp = templet;
    temp = temp.replace(/\{\{(.*)\}\}/g, function (s, t) {
      if (_data[t]) {
        return _data[t];
      }
    });
    el.innerHTML = temp;
  }

  //初始化時候手動渲染一次
  render();
}

var app = new Element('test', {
  name: 'zhangsan',
  age: 18
})

實現(xiàn)視圖到數(shù)據(jù)的綁定

這里做一個簡單的input改變的事件監(jiān)聽

每次渲染之后都要重新添加事件,用時間委托可以實現(xiàn),但是input的focus位置不能保留

可見Vue內(nèi)部的渲染和事件綁定肯定不是像這里demo寫的那么簡單,這里只是大致的原理(可能并不是這樣的。。。)

<div id="test">
  <input type="text" value="">
  <br>
  <span></span>
</div>
function Element(id, initData) {
  var self = this;
  var el = document.getElementById(id);
  var templet = el.innerHTML;
  var input = el.getElementsByTagName('input')[0];
  var _data = initData;

  Object.defineProperty(self, 'data', {
    set: function (value) {
      _data = value;
      render();
    },
    get: function () {
      return _data;
    },
  });

  //渲染
  function render() {
    var temp = templet;
    temp = temp.replace(/\{\{(data)\}\}/g, function (s, t) {
      return _data;
    });
    el.innerHTML = temp;

    //重新添加事件,其實應該用事件委托的
    input = el.getElementsByTagName('input')[0];
    inputchange();
    input.focus();
  }

  function inputchange() {
    if (window.attachEvent) {
      input.attachEvent("oninput", temp);
    } else if (window.addEventListener) {
      input.addEventListener("input", temp, false);
    }

    function temp() {
      self.data = input.value;
    }
  }

  //初始化時候手動渲染一次
  render();
}
var app = new Element('test', '');

以上就是Vue 數(shù)據(jù)綁定的原理分析的詳細內(nèi)容,更多關(guān)于Vue 數(shù)據(jù)綁定的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue實現(xiàn)前進刷新后退不刷新效果

    vue實現(xiàn)前進刷新后退不刷新效果

    這篇文章主要介紹了vue實現(xiàn)前進刷新,后退不刷新效果,即加載過的界面能緩存起來(返回不用重新加載),關(guān)閉的界面能被銷毀掉(再進入時重新加載)。本文給大家分享實現(xiàn)思路,需要的朋友可以參考下
    2018-01-01
  • 淺談實現(xiàn)vue2.0響應式的基本思路

    淺談實現(xiàn)vue2.0響應式的基本思路

    這篇文章主要介紹了淺談實現(xiàn)vue2.0響應式的基本思路,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • vue實現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的操作

    vue實現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的操作

    這篇文章主要介紹了vue實現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的操作,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • vue中el-date-picker限制選擇7天內(nèi)&禁止內(nèi)框選擇

    vue中el-date-picker限制選擇7天內(nèi)&禁止內(nèi)框選擇

    項目中需要選擇時間范圍,并且只能選擇當前日期之后的七天,本文就來介紹了vue中el-date-picker限制選擇7天內(nèi)&禁止內(nèi)框選擇,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Vue3?中的插件和配置推薦大全

    Vue3?中的插件和配置推薦大全

    這篇文章主要介紹了Vue3?中的插件和配置推薦大全,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • vue3集成Element-Plus之全局導入和按需導入

    vue3集成Element-Plus之全局導入和按需導入

    這篇文章主要給大家介紹了關(guān)于vue3集成Element-Plus之全局導入和按需導入的相關(guān)資料,element-plus正是element-ui針對于vue3開發(fā)的一個UI組件庫,?它的使用方式和很多其他的組件庫是一樣的,需要的朋友可以參考下
    2023-07-07
  • 淺談Vue2.0父子組件間事件派發(fā)機制

    淺談Vue2.0父子組件間事件派發(fā)機制

    本篇文章主要介紹了淺談Vue2.0父子組件間事件派發(fā)機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • vue實現(xiàn)折疊展開收縮動畫效果

    vue實現(xiàn)折疊展開收縮動畫效果

    這篇文章主要介紹了vue實現(xiàn)折疊展開收縮動畫,通過scrollHeight實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2023-11-11
  • Vue 中對圖片地址進行拼接的方法

    Vue 中對圖片地址進行拼接的方法

    今天小編就為大家分享一篇Vue 中對圖片地址進行拼接的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue中el-table多層級嵌套的具體實現(xiàn)

    vue中el-table多層級嵌套的具體實現(xiàn)

    本文主要介紹了vue中el-table多層級嵌套的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-10-10

最新評論

永安市| 灵台县| 锦州市| 邛崃市| 洞头县| 焦作市| 壤塘县| 唐河县| 湖口县| 六盘水市| 准格尔旗| 沾益县| 镇原县| 红河县| 百色市| 加查县| 巴彦淖尔市| 石河子市| 轮台县| 岫岩| 宁陕县| 临洮县| 舞钢市| 乐平市| 常州市| 卢氏县| 婺源县| 巴林左旗| 乌拉特前旗| 稷山县| 徐闻县| 漳浦县| 高青县| 高邑县| 灌阳县| 兴业县| 库车县| 龙岩市| 镶黄旗| 柳江县| 宣武区|