国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

如何實現雙向綁定mvvm的原理實現

2024-05-06 15:38:52
字體:
來源:轉載
供稿:網友

本文能幫你做什么?

1、了解vue的雙向數據綁定原理以及核心代碼模塊
2、緩解好奇心的同時了解如何實現雙向綁定

為了便于說明原理與實現,本文相關代碼主要摘自vue源碼, 并進行了簡化改造,相對較簡陋,并未考慮到數組的處理、數據的循環依賴等,也難免存在一些問題,歡迎大家指正。不過這些并不會影響大家的閱讀和理解,相信看完本文后對大家

在閱讀vue源碼的時候會更有幫助

本文所有相關代碼均在github上面可找到 github.com/DMQ/mvvm

相信大家對mvvm雙向綁定應該都不陌生了,一言不合上代碼,下面先看一個本文最終實現的效果吧,和vue一樣的語法,如果還不了解雙向綁定,猛戳Google

<div id="mvvm-app">  <input type="text" v-model="word">  <p>{{word}}</p>  <button v-on:click="sayHi">change model</button></div><script src="./js/observer.js"></script><script src="./js/watcher.js"></script><script src="./js/compile.js"></script><script src="./js/mvvm.js"></script><script>var vm = new MVVM({  el: '#mvvm-app',    data: {      word: 'Hello World!'    },    methods: {      sayHi: function() {        this.word = 'Hi, everybody!';      }    }  });</script>

幾種實現雙向綁定的做法

目前幾種主流的mvc(vm)框架都實現了單向數據綁定,而我所理解的雙向數據綁定無非就是在單向綁定的基礎上給可輸入元素(input、textare等)添加了change(input)事件,來動態修改model和 view,并沒有多高深。所以無需太過介懷是實現的單向或雙向綁定。

實現數據綁定的做法有大致如下幾種:

發布者-訂閱者模式(backbone.js) 臟值檢查(angular.js) 數據劫持(vue.js)

發布者-訂閱者模式: 一般通過sub, pub的方式實現數據和視圖的綁定監聽,更新數據方式通常做法是 vm.set('property', value),這里有篇文章講的比較詳細,有興趣可點這里

這種方式現在畢竟太low了,我們更希望通過 vm.property = value這種方式更新數據,同時自動更新視圖,于是有了下面兩種方式

臟值檢查: angular.js 是通過臟值檢測的方式比對數據是否有變更,來決定是否更新視圖,最簡單的方式就是通過 setInterval() 定時輪詢檢測數據變動,當然Google不會這么low,angular只有在指定的事件觸發時進入臟值檢測,大致如下:

DOM事件,譬如用戶輸入文本,點擊按鈕等。( ng-click ) XHR響應事件 ( $http ) 瀏覽器Location變更事件 ( $location ) Timer事件( timeout ,interval ) 執行 digest() 或apply()

數據劫持: vue.js 則是采用數據劫持結合發布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發布消息給訂閱者,觸發相應的監聽回調。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新化县| 满城县| 张北县| 江北区| 汉寿县| 包头市| 滨州市| 建水县| 北海市| 东乡| 宜阳县| 肃南| 丰宁| 兴宁市| 双鸭山市| 奎屯市| 永嘉县| 阿城市| 尼玛县| 平定县| 石阡县| 蚌埠市| 尚义县| 泽州县| 宝鸡市| 旬邑县| SHOW| 墨脱县| 莱州市| 阜城县| 澄城县| 镇沅| 怀来县| 襄樊市| 高邑县| 防城港市| 日照市| 乾安县| 凤山县| 鞍山市| 黔江区|