本文參考的是前輩的簡易版本Vue實現:http://www.cnblogs.com/canfoo/p/6891868.html,感謝。前輩GitHub地址:https://github.com/canfoo/self-vue
雖然前輩的文章寫的已經很淺顯了,但依然沒有一開始就看懂代碼啊,對了,前輩的文章有它的github地址,上面可以直接下載代碼。
好在我雖不才卻能堅持,看了一下午終於是入了門,再經過一些試驗性的代碼修改和測試,終於明白是怎么回事了。現在總結如下。
核心思路:V1還不算完全形態的Vue,所以直接從V2看起。
具體思路:
1,將Vue對象里面的data全部作一次監聽。通過get的方式。
2,一旦data里面的數據發生改變,則被set方法劫持。第一層代理劫持產生內層的賦值
3,內層觸發了更新依賴的函數,js代碼層次的數據變化更新到dom上面
4,更新函數通過更該dom節點來更新dom,這個時候更新的不在innerHTML
將Vue對象里面的data全部作一次監聽。通過get的方式。
下圖是遍歷,遍歷的結果是data里面的數據,都執行get方法,實際是通過defineProperty的get方法實現的。
於是都被緩存到observer里面。
一旦data里面的數據發生改變,則被set方法劫持。第一層代理劫持產生內層的賦值
為了直接修改data里面數據,而不是通過data.方式修改數據,所以做了兩層代理劫持。這個原文作者也有說到。
外層代理
內存代理
內層觸發了更新依賴的函數,js代碼層次的數據變化更新到dom上面
也就是set下的通知函數。實際是告訴Watcher執行update。
更新函數通過更該dom節點來更新dom,這個時候更新的不在innerHTML
這里涉及一個知識點:document.createDocumentFragment();DocumentFragments
是DOM節點。它們不是主DOM樹的一部分。通常的用例是創建文檔片段,將元素附加到文檔片段,然后將文檔片段附加到DOM樹。在DOM樹中,文檔片段被其所有的子元素所代替。
直接修改node的內容就會同步到dom中。