亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

淺談mvvm-simple雙向綁定簡單實現

2019-11-19 14:00:34
字體:
來源:轉載
供稿:網友

mvvm模式解放DOM枷鎖

mvvm原理分析

JavaScript在瀏覽器中操作HTML經歷了幾個不同階段

第一階段 直接用瀏覽器提供的原生API操作DOM元素

var dom = document.getElementById('id');dom.innerHTML = 'hello mvvm';

第二階段 jQuery的出現解決了原生API的復雜性和瀏覽器間的兼容性等問題,提供了更加簡易方便的API

$('#id').text('hello mvvm')

第三階段 MVC模式使前端可以和后端配合,修改服務端渲染后的頁面內容

而隨著產品對于用戶體驗的重視,交互體驗越來越重要,僅用jQuery遠遠不夠。 MVVM模型解決了頻繁操作的痛點,Model-View-ViewModel模式將數據與視圖的同步交由ViewModel完成

jQuery修改節點內容:

<p>name: <span id="name">vist</span>!</p><p>age: <span id="age">25</span>.</p>var name = 'bestvist';var age = 26;$('#name').text(name);$('#age').text(age);

MVVM模式下只需要關注數據結構:

var me = {  name: 'vist',  age: 25}

修改相應屬性就好

me.name = 'bestvist';me.age = 26;

mvvm實現

mvvm實現數據綁定的幾種方式:

  1. 發布-訂閱模式
  2. 臟值檢查
  3. 數據劫持

比較流行的vue采用的就是數據劫持和發布-訂閱模式,通過劫持es5提供的Object.defineProperty()中各個屬性的get,set方法, 數據更新時觸發消息給訂閱者,實現數據綁定功能。

Object.defineProperty(obj, prop, descriptor)方法直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性,并返回這個對象。 該方法接受3個參數:

  • obj 定義屬性的對象。
  • prop 被定義或修改的屬性名。
  • descriptor 被定義或修改的屬性的描述符。

一般情況通過直接給對象屬性賦值來創建屬性或者修改對應屬性,而使用Object.defineProperty可以修改對象屬性的一些額外默認配置。 如:

const obj = {name: 'Tom'};Object.defineProperty(obj, 'name', { get: function(val) {   return 'Jerry';  }})console.log(obj.name);//輸出: Jerry

Object.defineProperty詳細解釋,請戳這里

mvvm實現的主要流程:

  • 數據代理,訪問實例上的屬性時直接返回對應data里的屬性
  • 數據監聽,對實例上的屬性監聽,如果數據改變通知訂閱者更新
  • 指令解析,對每個元素節點進行解析,替換數據并綁定更新函數
  • 鏈接數據監聽和指令解析,保證每個數據的更新,指令解析都可以獲取并更新視圖

實例化類:

new MVVM({  el: '#app',  data() {    return {      message: 'hello mvvm'    }  }})

數據代理:

class MVVM {  constructor(options) {    this.$options = options || {};    let data = this._data = this.$options.data();    // 數據代理 vm.xxx => vm._data.xxx    Object.keys(data).forEach(key => {      this._proxyData(key);    });    // observe(data, this);    // this.$compile = new Compile(options.el || document.body, this);  }  _proxyData(key) {    Object.defineProperty(this, key, {      configurable: true,      enumerable: true,      get: () => {        return this._data[key];      },      set: newVal => {        this._data[key] = newVal;      }    });  }}

數據監聽,劫持實例屬性更新

class Observer {  constructor(data) {    this.data = data;    Object.keys(this.data).forEach(key => {      this.defineReactive(key, this.data[key]);    })  }  // 定義反應  defineReactive(key, val) {    let dep = new Dep();    Object.defineProperty(this.data, key, {      enumerable: true,      configurable: false,      get: () => {        return val;      },      set: newVal => {        if (val === newVal) {          return;        }        val = newVal;        // 賦值對象再進行劫持        observe(val);        ... // 數據修改通知      }    })  }}function observe(val) {  if (!val || typeof val !== 'object') {    return;  }  return new Observer(val);}

指令解析部分代碼

class Compile {  constructor(el, vm) {    this.$vm = vm;    this.$el = this.isElementNode(el) ? el : document.querySelector(el);    if (this.$el) {      this.$fragment = this.node2Fragment(this.$el);      this.init();      this.$el.appendChild(this.$fragment);    }  }  init() {    this.compileElement(this.$fragment);  }  node2Fragment(el) {    let fragment = document.createDocumentFragment(), child;    // 原生節點拷貝到fragment    while (child = el.firstChild) {      // appendChild將元素從dom上移到fragment      fragment.appendChild(child);    }    return fragment;  }  compileElement(el) {    let childNodes = el.childNodes;    [].slice.call(childNodes).forEach(node => {      let text = node.textContent;      let reg = //{/{(.*)/}/}/;      if (this.isElementNode(node)) {        this.compile(node);      } else if (this.isTextNode(node) && reg.test(text)) {        this.compileText(node, RegExp.$1);      }      if (node.childNodes && node.childNodes.length) {        this.compileElement(node);      }    })  }}

其中

while (child = el.firstChild) {  // appendChild將元素從dom上移到fragment  fragment.appendChild(child);}

通過appendChild改變原dom結構特點,逐步把dom元素節點移到fragment中。

完整代碼 Vue源碼

總結

以數據流為導向的mvvm模式極大的簡化前端對于dom的操作,加快前端開發速度,同時也提高了用戶體驗。

參考:

剖析Vue原理&實現雙向綁定MVVM mvvm廖雪峰

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美不卡视频一区发布| 亚洲欧美日韩成人| 亚洲欧美激情在线视频| 国产精品视频中文字幕91| 久久精品国产2020观看福利| 中国人与牲禽动交精品| 亚洲精品成人久久电影| 91超碰中文字幕久久精品| 成人a级免费视频| 欧美性猛交xxxx免费看| 国产成人av网址| 欧美大片大片在线播放| 日韩美女免费线视频| 一本一本久久a久久精品牛牛影视| 欧美裸体视频网站| 日韩欧美一区二区三区| 国产精品户外野外| 黄色成人在线免费| 国产婷婷97碰碰久久人人蜜臀| 亚洲高清久久网| 成人在线小视频| 国产精品激情av在线播放| 精品免费在线视频| 精品亚洲国产视频| 国产欧美 在线欧美| 欧美丰满少妇xxxxx做受| 亚洲一区二区三区乱码aⅴ蜜桃女| 一区二区三区久久精品| 亚洲国产成人91精品| 亚洲女同精品视频| 亚洲精品中文字幕av| 中国日韩欧美久久久久久久久| 91在线视频成人| 日韩欧美国产网站| 日本最新高清不卡中文字幕| 国产精品视频免费在线观看| 精品久久久免费| 欧美日韩一区二区免费视频| 欧美日韩精品在线观看| 最近中文字幕日韩精品| 91在线网站视频| 日韩av在线影院| 97超级碰在线看视频免费在线看| 日韩欧美高清在线视频| 伊人亚洲福利一区二区三区| 亚洲男子天堂网| 国产精品视频xxxx| 成人精品视频久久久久| 影音先锋欧美在线资源| 精品久久久久久| 亚洲精品免费在线视频| 久久久999精品免费| 欧美日韩亚洲视频一区| 亚洲国产精品va在线| 国产成人一区二区三区电影| 精品成人国产在线观看男人呻吟| 欧美一级淫片videoshd| 亚洲天堂第二页| 久久精品电影网站| 欧美国产日韩中文字幕在线| 免费91在线视频| 亚洲毛片在线看| 国自在线精品视频| 国产亚洲精品久久久久久777| 久久综合五月天| 欧美亚洲成人免费| 亚洲第一黄色网| 亚洲精品视频二区| 国产精品久久久久久久久久| 久久久久久久久久国产精品| 久久99国产精品久久久久久久久| 国产日韩欧美在线视频观看| 日韩av在线一区二区| 91高潮精品免费porn| 91亚洲人电影| 中文字幕亚洲在线| 亚洲国产精品久久久久秋霞不卡| 日韩精品在线视频| 亚洲女人天堂色在线7777| 欧美视频在线视频| 久久深夜福利免费观看| 亚洲人成在线一二| 欧美精品免费在线观看| 国产精品av电影| 国产丝袜精品视频| 欧美成人四级hd版| 国产精品网红直播| 成人久久18免费网站图片| 色999日韩欧美国产| 91成人福利在线| 国产精品999999| 久久噜噜噜精品国产亚洲综合| 91免费国产视频| 国产精品视频一区国模私拍| 91国产一区在线| 国产精品久久999| 成人在线播放av| 欧美大片va欧美在线播放| 亚洲成人激情在线| 久久视频在线播放| 久久久999国产精品| 高清欧美性猛交xxxx黑人猛交| 国产91热爆ts人妖在线| 国产日韩av高清| 亚洲欧美日韩直播| 久久视频中文字幕| 欧美最近摘花xxxx摘花| 日韩亚洲一区二区| 成人午夜激情免费视频| 国产精品久久久久久久久久免费| 日本精品免费一区二区三区| 91色在线观看| 日韩av电影在线网| 在线观看视频99| 国产成人激情视频| 夜夜嗨av一区二区三区四区| 欧美丝袜美女中出在线| 欧美成人免费全部观看天天性色| 久久男人的天堂| 久久国产一区二区三区| 欧美老女人xx| 国产69精品久久久久9| 97国产suv精品一区二区62| 久久精品国产亚洲精品2020| 69av在线视频| 97视频在线观看免费高清完整版在线观看| 欧美一级大片在线观看| 最近的2019中文字幕免费一页| 深夜福利国产精品| 一本色道久久88综合亚洲精品ⅰ| 奇门遁甲1982国语版免费观看高清| 亚洲性av网站| 亚洲少妇激情视频| 亚洲成人久久久久| 欧美性资源免费| 欧美一级大片在线观看| 亚洲片在线观看| 亚洲色图15p| 久久伊人色综合| 91禁外国网站| 欧美一级大片在线免费观看| 一区二区三区视频观看| 欧美精品久久久久久久| 91国内精品久久| 欧美性猛交xxxx黑人| 欧美美女操人视频| 国产一区二区成人| 欧美麻豆久久久久久中文| 欧美成人午夜激情在线| 92福利视频午夜1000合集在线观看| 亚洲国产成人精品久久久国产成人一区| 国产视频在线一区二区| 中文字幕国产精品| 日韩成人中文电影| 97视频在线观看亚洲| 欧美专区在线播放| 成人网页在线免费观看| 中文字幕亚洲情99在线| 91精品视频大全| 日韩电影中文字幕在线观看| 色中色综合影院手机版在线观看| 欧美日韩亚洲一区二| 久久69精品久久久久久国产越南| 久久精品国产96久久久香蕉|