Vue原始碼解析06 手寫自己的Vue

2021-10-06 17:05:36 字數 1893 閱讀 4408

最近一段時間一直在研究 vue 的原始碼,突然間想寫乙個乞丐的 vue 實現,為了理一下自己的思路,同時也作為乙個階段性的總結.

vue 雙向繫結看這裡

vue2.0/1.0 雙向資料繫結簡單來說就是利用了 object.defineproperty()和觀察者模式對 data 資料進行資料劫持.

廢話不多說,直接上**

//watcher,觀察者,真正執行更新操作的角色

class watcher

//用來執行我們的更新函式

update()

}

//dep負責維護乙個更新佇列,

class dep

//新增更新佇列(這是乙個乞丐版的)

adddep(watcher)

//通知佇列更新

notify()

}

class vue

this.$data = options.data||{}

//執行響應化處理

this.$data&&this.observe(this.$data)

//執行編譯

new compile(options.el, this)

}observe(obj))

}//資料劫持

definereactive(obj,key,val),

set(newval)}})

} //**資料

proxydata(key),

set(newval)})}

}

編譯的實現原理很簡單,我們可以簡化為三步:

現在看一下**的實現

class compile

//編譯

compile(el)else if(this.istext(node))

//如果子元素下面還有子元素,遞迴處理

if(node.childnodes&&node.childnodes.length>0)})}

//編譯元素節點

compileelement(node)else if(name.indexof('@')>-1)})}

//編譯文字節點

compiletext(node)

text(node,key)

//雙向資料繫結

model(node,key))

}html(node,key)

//update函式

update(node,key,dir))

}//更新text文字

textupdater(node,val)

//更新v-html

htmlupdater(node,val)

//model更新函式

modelupdater(node,val)

//判斷是否為元素節點

iselement(node)

//判斷是否為文字節點

istext(node)}

const res = node.nodetype===3&&/\\}/.test(node.textcontent)

return res}}

以上,就是乙個乞丐版的 vue,簡單的實現了 vue 的雙向資料繫結和 dom 編譯解析更新.這裡只是實現了乙個簡單的函式更新,vue2.0 裡面的 watcher.run()函式是進行虛擬 dom 的更新.

雖然是乞丐版的實現,但是感覺思路是相通的:通過 object.defineproperty 實現資料劫持,通過 compile 模組實現 dom 的更新.

原始碼在這裡

react原始碼解析14 手寫hooks

1.開篇介紹和面試題 2.react的設計理念 3.react原始碼架構 4.原始碼目錄結構和除錯 5.jsx 核心api 6.legacy和concurrent模式入口函式 7.fiber架構 8.render階段 9.diff演算法 10.commit階段 11.生命週期 12.狀態更新流程 1...

手撕VUE原始碼 一 手寫乙個MVVM

class vue class observer observer data reactive key,value,data set newvalue class compiler compilertodata fregment else compilerelementnode node attr ...

原始碼 自己寫的Msg

返回提示資訊類 public class msg if sql.indexof where 1 if sql.indexof group by 1 if sql.indexof order by 1 return sql public msg public static void confirm s...