欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

原理

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

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

  • 方式1

定義了同名的get/set就相當(dāng)于定義了age

 var test = {
   _age: 18,
   get age() {
     console.log('觸發(fā)get');
     //直接會this.age會進(jìn)入死遞歸的
     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會進(jìn)入死遞歸的
     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;

    //重新添加事件,其實應(yīng)該用事件委托的
    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ù)綁定的原理分析的詳細(xì)內(nèi)容,更多關(guān)于Vue 數(shù)據(jù)綁定的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue Build后的項目的根路徑配置方式

    Vue Build后的項目的根路徑配置方式

    這篇文章主要介紹了Vue Build后的項目的根路徑配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • VUE引入使用G2圖表的實現(xiàn)

    VUE引入使用G2圖表的實現(xiàn)

    本文主要介紹了VUE引入使用G2圖表的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Vue 2.0學(xué)習(xí)筆記之Vue中的computed屬性

    Vue 2.0學(xué)習(xí)筆記之Vue中的computed屬性

    本篇文章主要介紹了Vue 2.0學(xué)習(xí)筆記之Vue中的computed屬性,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • vue實現(xiàn)旋轉(zhuǎn)木馬動畫

    vue實現(xiàn)旋轉(zhuǎn)木馬動畫

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)旋轉(zhuǎn)木馬動畫,圖片數(shù)量無限制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • vue中@click綁定多個事件問題(教你避坑)

    vue中@click綁定多個事件問題(教你避坑)

    這篇文章主要介紹了vue中@click綁定多個事件問題(教你避坑),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • element-plus 下拉框?qū)崿F(xiàn)全選的示例代碼

    element-plus 下拉框?qū)崿F(xiàn)全選的示例代碼

    本文主要介紹了element-plus 下拉框?qū)崿F(xiàn)全選的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • vue3點擊出現(xiàn)彈窗后背景變暗且不可操作的實現(xiàn)代碼

    vue3點擊出現(xiàn)彈窗后背景變暗且不可操作的實現(xiàn)代碼

    這篇文章主要介紹了vue3點擊出現(xiàn)彈窗后背景變暗且不可操作的實現(xiàn)代碼,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 源碼分析Vue.js的監(jiān)聽實現(xiàn)教程

    源碼分析Vue.js的監(jiān)聽實現(xiàn)教程

    這篇文章主要通過源碼分析介紹了Vue.js的監(jiān)聽實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • Vue編譯器實現(xiàn)代碼生成方法介紹

    Vue編譯器實現(xiàn)代碼生成方法介紹

    這篇文章主要介紹了Vue編譯器實現(xiàn)代碼生成方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Vue-cli-webpack搭建斗魚直播步驟詳解

    Vue-cli-webpack搭建斗魚直播步驟詳解

    斗魚直播是比較火的直播視頻,想必大家都看過吧。這篇文章主要介紹了Vue-cli-webpack搭建斗魚直播步驟詳解,需要的朋友可以參考下
    2017-11-11

最新評論