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

淺談Vue數(shù)據(jù)綁定的原理

 更新時間:2018年01月08日 08:18:51   作者:TMaize''''''''Blog  
本篇文章主要介紹了淺談Vue數(shù)據(jù)綁定的原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文介紹了Vue數(shù)據(jù)綁定的原理,分享給大家,具體如下:

原理

其實原理很簡單,就是攔截了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;

 //重新添加事件,其實應(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', '');

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue實現(xiàn)數(shù)字動畫的幾種方案

    Vue實現(xiàn)數(shù)字動畫的幾種方案

    本文介紹了三種使用Vue實現(xiàn)動態(tài)數(shù)字動畫的方案:使用Vue的響應(yīng)式數(shù)據(jù)與`setInterval`逐步更新數(shù)字,通過Vue的動畫API和CSS動畫效果為數(shù)字增加過渡效果,以及使用更高效的`requestAnimationFrame`來提供更加流暢的動畫表現(xiàn),每種方案都詳細說明了原理、實現(xiàn)步驟和代碼示例
    2025-02-02
  • Vue自定義事件(詳解)

    Vue自定義事件(詳解)

    下面小編就為大家?guī)硪黄猇ue自定義事件(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • vue中對象的賦值Object.assign({}, row)方式

    vue中對象的賦值Object.assign({}, row)方式

    這篇文章主要介紹了vue中對象的賦值Object.assign({}, row)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JSON數(shù)組和JSON對象在vue中的獲取方法

    JSON數(shù)組和JSON對象在vue中的獲取方法

    這兩天在學習vue,主要是為了實現(xiàn)前后端的分離,因此數(shù)據(jù)的傳輸是必不可少的一個環(huán)節(jié),這篇文章主要介紹了JSON數(shù)組和JSON對象在vue中的獲取方法,需要的朋友可以參考下
    2022-09-09
  • Vue項目中引入外部文件的方法(css、js、less)

    Vue項目中引入外部文件的方法(css、js、less)

    本篇文章主要介紹了Vue項目中引入外部文件的方法(css、js、less),非常具有實用價值,需要的朋友可以參考下
    2017-07-07
  • Vue中computed屬性和watch,methods的區(qū)別

    Vue中computed屬性和watch,methods的區(qū)別

    本文主要介紹了Vue中computed屬性和watch,methods的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • vue+elementui實現(xiàn)動態(tài)控制表格列的顯示和隱藏

    vue+elementui實現(xiàn)動態(tài)控制表格列的顯示和隱藏

    這篇文章主要介紹了vue+elementui實現(xiàn)動態(tài)控制表格列的顯示和隱藏,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue?input組件如何設(shè)置失焦與聚焦

    vue?input組件如何設(shè)置失焦與聚焦

    這篇文章主要介紹了vue?input組件如何設(shè)置失焦與聚焦,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • VUE : vue-cli中去掉路由中的井號#操作

    VUE : vue-cli中去掉路由中的井號#操作

    這篇文章主要介紹了VUE : vue-cli中去掉路由中的井號#操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue頁面使用阿里oss上傳功能的實例(一)

    vue頁面使用阿里oss上傳功能的實例(一)

    本篇文章主要介紹了vue頁面使用阿里oss上傳功能的實例(一),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

凤凰县| 织金县| 蒲城县| 宜兴市| 宁陵县| 汤阴县| 姜堰市| 毕节市| 会宁县| 历史| 南昌县| 松潘县| 清流县| 望谟县| 华宁县| 荥阳市| 乌兰察布市| 千阳县| 板桥市| 天津市| 社旗县| 灵台县| 安陆市| 汉中市| 颍上县| 错那县| 横山县| 容城县| 镇江市| 姚安县| 淮滨县| 南雄市| 阿拉善盟| 芒康县| 康乐县| 互助| 密云县| 陆良县| 白沙| 洛南县| 鲜城|