Vue原始碼之render函式(四)

2021-08-21 04:40:44 字數 1529 閱讀 9214

在$mount函式中,最後呼叫的updatecomponent函式,該函式中的呼叫了例項的私有函式vm._render,因此,現在需要弄清楚vm._render函式完成了什麼功能。

在'src/core/instance/render.js'中,在vue的原型上定義了私有_render函式。

1. 首先從vm.$options中拿到render函式,先暫時忽略其他部分**,然後通過呼叫render函式獲得vnode。

2. 可以看到,在呼叫render 函式時,傳入了兩個引數,首先是上下文renderproxy,然後是引數$createelement。

其中的$createelement是乙個函式,返回的是乙個vnode。它被定義在手寫render函式的情況下,vm._c被定義的是通過template編譯的情況下呼叫。

3. _renderproxy在『./init.js』中定義,在開發環境中,呼叫initproxy函式。

4. initproxy函式在'proxy.js'中被定義。es6中,proxy的用途是對於new proxy(target, handlers)中的target物件都進行劫持,也就是使用handlers進行處理。

在這裡,handlers對應的處理是hashandlers,hashandler的作用是首先判斷例項中已經定義該屬性,然後再判斷屬性的格式是否與api名字重複以及是否是以下劃線命名'_'(這兩種情況是不符合要求的)。如果符合這兩種情況,則vue會丟擲警告。

5. 再回到render函式,'src/core/instance/render.js'中,如果vnode不是vnode的例項,且是乙個陣列,則vue會丟擲乙個警告。

_render函式主要是通過呼叫vm.$options.render函式,並返回乙個vnode。vm.$options中的render函式主要是呼叫了$createelement函式,這個函式會返回乙個node。同時,在呼叫render函式時,還會經過proxy**檢查屬性是否滿足要求。

Vue之Render函式高階篇

一 v if v else 利用if else代替 二 v for 必須用map 三 v model 父子元件相互傳值 四 修飾符 1 vue自帶修飾符 修飾符字首 作用.once 事件只執行一次 capture 給元素新增乙個 當元素發生冒泡時,先觸發帶有該修飾符的元素。若有多個該修飾符,則由外而...

Vue原始碼之createElement函式(五)

在render 函式中,最後呼叫的是createelement函式來返回vnode,那麼createelement函式到底完成了什麼功能 1.首先看一下vnode的定義 src core vdom vnode.js vnode被定義為乙個類。2.在createelement中,首先檢測data的型別...

vue原始碼之Array

目錄 響應式具體實現 陣列子集和新增元素的追蹤 array中的問題 object通過setter改變屬性的值,所以我們利用getter時傳送依賴收集,在setter時觸發依賴更新,而且vue將資料轉換成響應式資料是在資料初始化時,對object中之後的屬性新增和刪除操作,無法做到自動更新,而是通過v...