摘要:的使用相信大家都很熟練了,使用起來簡單。但是大部分人不知道其內部的原理是怎么樣的,今天我們就來一起實現一個簡單的實現之前我們得先看一下的實現,因為主要是通過數據劫持來實現的,通過來完成數據的讀取和更新。
vue的使用相信大家都很熟練了,使用起來簡單。但是大部分人不知道其內部的原理是怎么樣的,今天我們就來一起實現一個簡單的vue
Object.defineProperty()實現之前我們得先看一下Object.defineProperty的實現,因為vue主要是通過數據劫持來實現的,通過get、set來完成數據的讀取和更新。
var obj = {name:"wclimb"} var age = 24 Object.defineProperty(obj,"age",{ enumerable: true, // 可枚舉 configurable: false, // 不能再define get () { return age }, set (newVal) { console.log("我改變了",age +" -> "+newVal); age = newVal } }) > obj.age > 24 > obj.age = 25; > 我改變了 24 -> 25 > 25
從上面可以看到通過get獲取數據,通過set監聽到數據變化執行相應操作,還是不明白的話可以去看看Object.defineProperty文檔。
流程圖 html代碼結構js調用{{form}}
new Vue({ el: "#wrap", data:{ form: "這是form的值", test: "我是粗體", }, methods:{ changeValue(){ console.log(this.form) this.form = "值被我改變了,氣不氣?" } } })Vue結構
class Vue{ constructor(){} proxyData(){} observer(){} compile(){} compileText(){} } class Watcher{ constructor(){} update(){} }
Vue constructor 構造函數主要是數據的初始化
proxyData 數據代理
observer 劫持監聽所有數據
compile 解析dom
compileText 解析dom里處理純雙花括號的操作
Watcher 更新視圖操作
Vue constructor 初始化class Vue{ constructor(options = {}){ this.$el = document.querySelector(options.el); let data = this.data = options.data; // 代理data,使其能直接this.xxx的方式訪問data,正常的話需要this.data.xxx Object.keys(data).forEach((key)=> { this.proxyData(key); }); this.methods = options.methods // 事件方法 this.watcherTask = {}; // 需要監聽的任務列表 this.observer(data); // 初始化劫持監聽所有數據 this.compile(this.$el); // 解析dom } }
上面主要是初始化操作,針對傳過來的數據進行處理
proxyData 代理dataclass Vue{ constructor(options = {}){ ...... } proxyData(key){ let that = this; Object.defineProperty(that, key, { configurable: false, enumerable: true, get () { return that.data[key]; }, set (newVal) { that.data[key] = newVal; } }); } }
上面主要是代理data到最上層,this.xxx的方式直接訪問data
observer 劫持監聽class Vue{ constructor(options = {}){ ...... } proxyData(key){ ...... } observer(data){ let that = this Object.keys(data).forEach(key=>{ let value = data[key] this.watcherTask[key] = [] Object.defineProperty(data,key,{ configurable: false, enumerable: true, get(){ return value }, set(newValue){ if(newValue !== value){ value = newValue that.watcherTask[key].forEach(task => { task.update() }) } } }) }) } }
同樣是使用Object.defineProperty來監聽數據,初始化需要訂閱的數據。
把需要訂閱的數據到push到watcherTask里,等到時候需要更新的時候就可以批量更新數據了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97706.html
摘要:前言月份開始出沒社區,現在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了一般來說,差不多到了轉正的時候,會進行總結或者分享會議那么今天我就把看過的一些學習資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區,現在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了!一般來說,差不多到了轉正的時候,會進行總結或者分享會議!那么今天我就...
平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進擊的 Promise Effective JavaScript leeheys blog -...
平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進擊的 Promise Effective JavaScript leeheys blog -...
閱讀 3146·2021-11-22 12:01
閱讀 3767·2021-08-30 09:46
閱讀 784·2019-08-30 13:48
閱讀 3209·2019-08-29 16:43
閱讀 1657·2019-08-29 16:33
閱讀 1848·2019-08-29 13:44
閱讀 1410·2019-08-26 13:45
閱讀 2228·2019-08-26 11:44