vue中實現了資料響應的原理最根本是使用了object.defineproperty , 還不知道怎麼用的小夥伴們可以看下mdn,馬上就能上手啦 附上**:
總的來說 object.defineproperty 接受 三個引數 ,
1.需要定義key的物件 即object ,
2.定義物件中屬性的key名城,
3.設定屬性的物件 其中 該物件中可設定的屬性有:
下面開始編寫簡易版的vue (一步步實現)
一 、首先建立乙個vue的建構函式
function vue (options = {})
function observe (data) ,
set(newvalue)})}
}function observe (data)
}
二 、如上**初始化資料的監聽模式 ,為了方便起見把this._data 中的key全部對映vue的例項中去(加粗為新增**)
function vue (options = {}) ,
set(newvalue)})}
}function observe (data) ,
set(newvalue)})}
}function observe (data)
}
三 、實現html中字元模板的編譯
function vue (options = {}) ,
set(newvalue)})}
new compile(this.$options.el , this)
}function compile(el, vm)
replace(fragment) //開始尋找dom中的字元模板並替換
function replace (fragment) }/; //文字幾點的正規表示式
if(node.nodetype == 3 && reg.test(content)))
node.textcontent = content.replace(reg , value)
}if(node.childnodes)})}
}function observe (data) ,
set(newvalue)})}
}function observe (data)
}
四 、 使用訂閱發布模式,監聽者達到資料響應模式,實現資料和檢視關聯,
注意 如下**中的 let dep =newdep();//建立發布訂閱模式 , 每當遞迴都會重新建立,造成資源浪費, 有待優化
function vue (options = {}) ,
set(newvalue)})}
new compile(options.el , this)
}function compile(el, vm)
replace(fragment) //開始尋找dom中的字元模板並替換
function replace (fragment) }/; //文字幾點的正規表示式
if(node.nodetype == 3 && reg.test(content)))
new watcher(vm , keyarr , function(newvalue))
node.textcontent = content.replace(reg , value)
}if(node.childnodes)})}
}function observe (data) ,
set(newvalue)})}
}function observe (data)
}function dep ()
dep.prototype.addsub = function (sub)
dep.prototype.notify = function () )
}function watcher (vm , keyarr , nodefn) )
dep.target = null;
}watcher.prototype.update = function () )
this.nodefn(value)
}
五、 實現v-model雙向資料繫結
function vue (options = {}) ,
set(newvalue)})}
new compile(options.el , this)
}function compile(el, vm)
replace(fragment) //開始尋找dom中的字元模板並替換
function replace (fragment) }/; //文字幾點的正規表示式
if(node.nodetype == 3 && reg.test(content)))
new watcher(vm , keyarr , function(newvalue))
node.textcontent = content.replace(reg , value)
}if(node.nodetype == 1)
new watcher(vm, attrvaluearr , function(newvalue))
node.addeventlistener("input" , function(e))})}
if(node.childnodes)})}
}function observe (data) ,
set(newvalue)})}
}function observe (data)
}function dep ()
dep.prototype.addsub = function (sub)
dep.prototype.notify = function () )
}function watcher (vm , keyarr , nodefn) )
dep.target = null;
}watcher.prototype.update = function () )
this.nodefn(value)
}
六、實現computed
function vue (options = {}) ,
set(newvalue)})}
initcomputed.call(this) //初始化computed屬性
new compile(options.el , this)
}function initcomputed())
})}function compile(el, vm)
replace(fragment) //開始尋找dom中的字元模板並替換
function replace (fragment) }/; //文字幾點的正規表示式
if(node.nodetype == 3 && reg.test(content)))
new watcher(vm , keyarr , function(newvalue))
node.textcontent = content.replace(reg , value)
}if(node.nodetype == 1)
new watcher(vm, attrvaluearr , function(newvalue))
node.addeventlistener("input" , function(e))})}
if(node.childnodes)})}
}function observe (data) ,
set(newvalue)})}
}function observe (data)
}function dep ()
dep.prototype.addsub = function (sub)
dep.prototype.notify = function () )
}function watcher (vm , keyarr , nodefn) )
dep.target = null;
}watcher.prototype.update = function () )
this.nodefn(value)
}
UNIAPP 如何初始化data資料
利用object.assign實現資料合併 12 default click initdata 點選初始化資料34 53334 表單域 form 如何置空?1 template 2 view 3 demo block title clear form padding 4 i cell title 清...
Vue初始化data失敗,Vue不能簡單地層級巢狀
class all dis no id search class cl select box id vipmenbers name v model vipselected value 請選擇option v for vip,i in vipmenberslist value vip.code opt...
對vue中的data進行資料初始化
this.data 是表示當前的改變後的this中的資料 this.options.data 是表示沒有賦值前的this中的資料,表示 初始化的data 一般可以使用object.assign this.data,this.options.data 來對data中的資料進行初始化操作。如果data中...