data的值 如何初始化vue 手寫簡易版Vue

2021-10-14 00:13:58 字數 4257 閱讀 8813

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中...