❝
實作簡單版本的 react,幫助了解 react 基本原理
- 支援 react jsx 文法;
- 實作 setState 節點更新;
- 添加生命周期鈎子;
- 切換為虛拟 dom 進行操作;
檢視源碼:https://github.com/howieyi/toy-react
❞
❝
這裡也實作了簡單版本 Vue,檢視基于 Proxy 實作了簡易版 Vue, 檢視源碼:https://github.com/howieyi/toy-vue
❞
環境配置
建構功能點
❝
需要基于 webpack/webpack-dev-server
❞
- 需要使用
進行文法轉換;
babel
- 需要使用
進行 jsx 文法解析,使用其内置參數
@babel/plugin-transform-react-jsx
自定義
pragma
别名;
createElement
- 需要使用 webpack-dev-server 特性,動态監聽更新,快速更進調試;
具體配置
指令配置
❝❞
- package.json scripts 中加入啟動指令;
- 使用
啟動項目;
npm run dev
1. JSX 的原理和關鍵實作
實作模闆
❝❞
- 實作 jsx 解析;
- 實作 jsx dom 節點解析;
- 實作 ToyReact.render 函數;
- 實作公共繼承類 Component;
實作 ToyReact 公共方法
❝❞
- 實作 createElement 核心邏輯;
- 實作 render 鈎子
ElementWrapper
元素節點類
ElementWrapper
❝
公共元素類,實作元素節點處理邏輯:
❞
- 實作構造函數,元素建立,最終還是基于 dom.createElement;
- 實作 setAttribute;
- 實作 appendChild;
- 實作 mountTo 函數;
TextWrapper
文本節點類
TextWrapper
❝
公共節點類,實作文本節點處理邏輯:
❞
- 實作構造函數,文本節點建立,最終還是基于 dom.createTextNode;
- 實作 mountTo 函數
Component
公共繼承類
Component
❝❞
- 實作構造函數,子元件收集,統一處理;
- 實作 setAttribute;
- 實作 appendChild;
- 實作 mountTo 函數,預設 this.render 傳回 vdom(即 creaElement 傳回的對象);
2. 添加生命周期
實作模闆
❝❞
- 支援 props;
- 支援 onClick 事件監聽;
- 支援 setState;
- 生命周期鈎子埋點;
改造 ToyReact.render
ToyReact.render
❝❞
- 增加 Range 用來記錄節點位置,友善處理更新;
- mountTo 統一使用 range
改造 ElementWrapper
ElementWrapper
❝❞
- appendChild 采用 range 處理;
- mountTo 采用 range 處理;
- 增加事件監聽;
改造 TextWrapper
TextWrapper
❝❞
- mountTo 采用 range 處理
改造 Component
公共類
Component
❝❞
- 引入 props;
- mountTo 使用 range;
- 增加 update 方法;
- 增加 setState 方法;
- 增加 生命周期鈎子;
- 增加深拷貝公共方法;
深拷貝
Component
公共類
Component
3. 切換虛拟 dom
改造 ElementWrapper
ElementWrapper
❝❞
- 引入 vdom,指向自己,以目前對象為 vdom;
- 改造 setAttribute/appendChild 為虛拟操作,緩存屬性和子節點;
- 改造 mountTo,此方法處理真實 dom,即節點建立、屬性、事件處理等;
改造 TextWrapper
TextWrapper
❝❞
- 引入 vdom,指向自己,以目前對象為 vdom;
- mountTo 處理真實節點
改造 Component
Component
❝❞
- 引入
;
vdom: this.render().vdom
- 改造
,這裡做節點比較,合理更新節點;
update
isSameNode
虛拟節點比較
isSameNode
isSameTree
虛拟節點樹比較
isSameTree
replaceNode
虛拟節點替換
replaceNode
Component
改動
Component
