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

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

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

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

原理

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

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

方式1

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

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

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

這里的渲染只是一個(gè)簡單的正則替換

要實(shí)現(xiàn)Vue那么強(qiáng)大的功能還要自己實(shí)現(xiàn)一個(gè)模板引擎

 

<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è)置新值的時(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;
 }

 //初始化時(shí)候手動(dòng)渲染一次
 render();
}

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

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

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

每次渲染之后都要重新添加事件,用時(shí)間委托可以實(shí)現(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;

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

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

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

相關(guān)文章

  • Vue路由守衛(wèi)案例代碼

    Vue路由守衛(wèi)案例代碼

    在Vue中,路由守衛(wèi)分為三種:全局路由守衛(wèi)、獨(dú)享路由守衛(wèi)以及組件內(nèi)路由守衛(wèi),本文重點(diǎn)介紹Vue路由守衛(wèi)案例代碼,需要的朋友可以參考下
    2023-02-02
  • vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法

    vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法

    這篇文章主要介紹了vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 使用Vue2實(shí)現(xiàn)簡單的購物車功能(可直接使用)

    使用Vue2實(shí)現(xiàn)簡單的購物車功能(可直接使用)

    這篇文章主要給大家介紹了如何使用Vue2實(shí)現(xiàn)簡單的購物車功能,文中有相關(guān)的代碼示例,對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • vue3表單輸入綁定方式

    vue3表單輸入綁定方式

    這篇文章主要介紹了vue3表單輸入綁定方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue簡單實(shí)現(xiàn)一個(gè)虛擬列表的示例代碼

    vue簡單實(shí)現(xiàn)一個(gè)虛擬列表的示例代碼

    虛擬列表只渲染當(dāng)前可視區(qū)域的列表,并不會(huì)將所有的數(shù)據(jù)渲染,本文主要介紹了vue簡單實(shí)現(xiàn)一個(gè)虛擬列表的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Vue組件之間的通信方式(推薦!)

    Vue組件之間的通信方式(推薦!)

    組件是 vue.js最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無法相互進(jìn)行直接的引用,所以組件間的相互通信是非常重要的,這篇文章主要給大家介紹了關(guān)于Vue組件之間的通信方式,需要的朋友可以參考下
    2022-06-06
  • vue3中vite的@路徑別名與path中resolve實(shí)例詳解

    vue3中vite的@路徑別名與path中resolve實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于vue3中vite的@路徑別名與path中resolve的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 詳解VUE 定義全局變量的幾種實(shí)現(xiàn)方式

    詳解VUE 定義全局變量的幾種實(shí)現(xiàn)方式

    本篇文章主要介紹了VUE 全局變量的幾種實(shí)現(xiàn)方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Vue使用三方工具vueUse實(shí)現(xiàn)虛擬列表

    Vue使用三方工具vueUse實(shí)現(xiàn)虛擬列表

    其實(shí)采用vueUse中的useVirtualList方法同樣可以實(shí)現(xiàn)虛擬列表,這篇文章小編就來和大家詳細(xì)介紹一下如何使用vueUse實(shí)現(xiàn)簡單的虛擬列表效果吧
    2024-04-04
  • Vue加入購物車判斷token添加登錄提示功能

    Vue加入購物車判斷token添加登錄提示功能

    加入購物車,是一個(gè)登錄后的用戶 才能進(jìn)行的操作,所以需要進(jìn)行鑒權(quán)判斷,判斷用戶token是否存在,這篇文章主要介紹了Vue加入購物車判斷token添加登錄提示,需要的朋友可以參考下
    2023-11-11

最新評(píng)論