Vue原始碼之createElement函式(五)

2021-08-21 04:44:59 字數 2009 閱讀 3558

在render 函式中,最後呼叫的是createelement函式來返回vnode,那麼createelement函式到底完成了什麼功能

1. 首先看一下vnode的定義('src/core/vdom/vnode.js'),vnode被定義為乙個類。

2.  在createelement中,首先檢測data的型別,通過判斷data是不是陣列,以及是不是基本型別,來判斷data是否傳入。如果沒有傳入,則將所有的引數向前賦值,且data=undifined。 

然後,判斷判斷傳入的normalize引數是否為真,為真的話,賦值給always_normalize常量。

最後,再呼叫_createelement函式,可以看到,createelement是對引數做了一些處理以後,將其傳給_createelement函式。

3. 在_createelement中,首先判斷data是不是響應式的,vnode中的data不能是響應式的。如果是,則vue丟擲警告

4. 最重要的部分是將children拍平為單維陣列。(『src/core/vdom/helpers/normalize-children,js』)在******normalizechildren函式中,主要完成的功能是將children類陣列的第一層轉換為乙個一維陣列。

在normalizechildren函式中,主要是呼叫normalizearraychildren函式去處理children類陣列

5. 在normalizearraychildren函式中,主要完成的功能是判斷children中的元素是不是陣列,如果是的話,就遞迴呼叫陣列,並將每個元素儲存在陣列中返回。

首先判斷children中的元素是不是陣列,是的話遞迴呼叫函式。如果第乙個和最後乙個都是文字節點的話,將其合併,優化。

然後,判斷該元素是不是基本型別。如果是,在判斷最後乙個結點是不是文字節點,是的話將其與該元素合併為乙個文字節點。否則,把這個基本型別轉換為文字節點(vnode)

最後一種情況,該元素是乙個vnode,先同樣進行優化(合併第乙個和最後乙個節點),然後判斷該節點的屬性,最後將該節點加入到結果中。

6. 回到creat-element.js中,在將children拍平為一維陣列後,接著判斷標籤(tag)是不是字串,是的話,則判斷該標籤是不是平台內建的標籤(如:『div』),是的話則建立該vnode。

然後判斷該標籤是不是元件,是的話,建立乙個元件vnode

如果都不是,則按照該標籤名建立乙個vnode。

如果標籤(tag)不是字串,則建立元件vnode。

至此,_createelement已經完成了建立vnode的功能,將其返回給render函式。

createelement函式主要是通過對children進行扁平化處理之後,通過對標籤(tag)的判斷,使用vnode類來生成vnode,並將其返回。

vue原始碼之Array

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

Vue 原始碼之 nextTick 解析

最近在看 vue 原始碼,一直很好奇這個 nexttick 怎麼實現。本文涉及微任務和巨集任務,不熟悉的可以看我之前的部落格 在瀏覽器環境中,常見的 macro task 有 settimeout messagechannel postmessage setimmediate。而常見的 micro ...

Vue原始碼學習之initEvents

vue原始碼學習之initevents initlifecycle是vue原始碼中core instance events.js下的乙個函式,和上節的initliftcycle一樣,該函式也是在beforecreate鉤子之前呼叫,作用是初始化元件中的事件。下面讓我們來進行 分析。1 initeve...