国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React 的最小實現 - Kut

mist14 / 2956人閱讀

摘要:是基于的最小實現。的實現可以參考這篇文章,我稱其為前向。而為簡單起見,仍使用原生事件,采用事件委托的方式,將所有監聽函數掛在上。的做法參考了的做法,實現了在上添加和刪除監聽函數的方法,并以判斷觸發的節點。

Kut


Kut,一個簡單的React-Like的前端視圖渲染庫,是我在學習React源碼時造的輪子。Kut是基于Typescript的React最小實現。目前Kut支持的Top-Level方法僅有兩個,即createElement、render,同時也支持組件化開發,Demo在這里。

本文主要對Kut的源碼進行說明和記錄,項目地址:Github。

源碼說明

源碼都在src目錄下,目前一共9個文件,分別如下。

component.ts

定義了Component類,以用于自定義組件,只是定義了一些屬性和方法,與React的Component類似。

element.ts

Element是用于構造Virtual DOM節點的對象,element.ts中包含一個工廠函數createElement。Element有3個屬性:type是類型,可以是DOM tag(如div等)或自定義組件(即Component子類);key用于diff時對節點進行唯一區分;children是子節點數組,其元素可以是文本或者Element,和React的區別是,如果children只有一項時,Kut的children仍是數組,不過只有一項。

instance.ts

instance.ts中包含了三種不同類型Element對應的實例類Instance,對應ReactComponent(注意區別Component,為避免混淆,Kut中命名為Instance),分別為文本實例TextInstance、DOM節點實例DOMInstance和自定義組件實例ComponentInstance。三種Instance類結構基本類似,首先包含其對應于DOM節點的唯一kutId,以方便進行掛載、更新和卸載;而index只用于列表項沒指定key時使用,可忽略;key和node用于獲取DOM節點的key和節點本身。

Instance的價值主要在于mount、shouldReceive、update和unmount方法。mount方法用于遍歷VDOM樹,拼接HTML和添加監聽函數。而shouldReceive用于判斷是否為同一節點,若Element的type和key相同,則直接調用update更新,否則調用unmount卸載并重新mount掛載。update方法則遞歸更新以當前節點為根節點的VDOM子樹,其中若children大于一項的,會使用diff算法計算其差異并調用patch進行更新。最后,unmount方法則從DOM樹上卸載節點,并清除引用。

diff.ts

對于列表項更新,需要使用diff算法計算其差異。React的實現可以參考這篇文章,我稱其為前向diff。Kut基本的實現邏輯和React是相似的,但對于把元素從列表中底部挪到頂部的做法,React的前向diff會導致DOM更新操作過多。Kut的做法是引入后向diff,邏輯是和前向diff一致,只是方向相反,時間復雜度仍為O(n)。取前向diff和后向diff的更新操作較少者,調用patch函數對DOM進行更新。這部分解釋我都寫在了diff.ts的注釋里了。

kut.ts/renderer.ts/constant.ts/util.ts

分別是入口文件、渲染方法、一些常量和一些工具函數。其中renderer.ts中定義了Element實例化instantiate函數(即由Element生成Instance)和render函數(使用innerHTML進行掛載),由于采用innerHTML方法進行掛載,需要使用事件委托來處理事件,也需要使用DOM節點唯一kutId進行區別,具體見event.ts。

event.ts

React為保證兼容性,具有合成事件。而Kut為簡單起見,仍使用原生事件,采用事件委托的方式,將所有監聽函數掛在document上。event.ts的做法參考了的做法,實現了在document上添加和刪除監聽函數的方法,并以kutId判斷觸發的節點。

后續計劃

最近忙著實習面試和論文暫時也沒太多時間加新功能,現在仍然有些bug,如componentDidMount的觸發時機不對。慢慢先打算支持異步更新和Context,起碼讓Redux能用對吧,先寫篇記錄免得后頭來看連自己都忘了(苦笑)。推薦個最近看到的關于React源碼的專欄,感覺講得還不錯的,在這里:編程小思。

歡迎pr和stars,項目地址:Github。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93827.html

相關文章

  • 前端面試題大集合:來自真實大廠532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網發布的真實大廠前端面經題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復,但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學習參考,學習者閱后也要用心鉆研其中的原理,重要知識需要系統學習、透徹學習,形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...

    Kerr1Gan 評論0 收藏0
  • 前端面試題大集合:來自真實大廠532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W發布的真實大廠前端面經題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復,但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學習參考,學習者閱后也要用心鉆研其中的原理,重要知識需要系統學習、透徹學習,形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...

    lushan 評論0 收藏0
  • 前端面試題大集合:來自真實大廠532道面試題(只有題,沒有答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W發布的真實大廠前端面經題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復,但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學習參考,學習者閱后也要用心鉆研其中的原理,重要知識需要系統學習、透徹學習,形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...

    joyvw 評論0 收藏0
  • 11 個最好 JavaScript 動態效果庫

    摘要:經過一番研究,我收集了個最好的庫,你可以用在自己的項目中。該庫于年月首次推出,目前仍有近名參與者開發。超過的,是一個動畫庫,可以處理屬性單個轉換或任何屬性,以及對象。對智能設備的方向作出反應的視差引擎快速創建漂亮的動畫。 翻譯:瘋狂的技術宅原文:https://blog.bitsrc.io/11-jav... 當我想要在網上找一個簡潔的 Javascript 動效庫時,總是發現很多推...

    wawor4827 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<