成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

自己造一個ReactDOM

開發 前端
本文會教你如何基于官方的reconciler,實現迷你ReactDOM。如果你想在任何可以繪制UI的環境使用React,都可以利用react-reconciler實現該環境下的React。

[[436840]]

大家好,我卡頌。

React可以看作是三部分的組合:

  • scheduler,調度器,用于調度任務
  • reconciler,協調器,用于計算任務造成的副作用
  • renderer,渲染器,用于在宿主環境執行副作用

這三者都是獨立的包,我們項目里引入的ReactDOM可以看作是以下三部分代碼打包而成:

  • scheduler的主要邏輯
  • reconciler部分邏輯
  • ReactDOM renderer的主要邏輯

本文會教你如何基于官方的reconciler,實現迷你ReactDOM。

本文參考Hello World Custom React Renderer[1]

項目初始化

通過CRA建立項目(或用已有項目):

  1. create-react-app xxx 

新建customRenderer.js,引入react-reconciler并完成初始化:

  1. // 本文使用的reconciler版本是0.26.2 
  2. import ReactReconciler from 'react-reconciler'
  3.  
  4. const hostConfig = {}; 
  5. const ReactReconcilerInst = ReactReconciler(hostConfig); 

其中hostConfig就是宿主環境的配置項。

最后,customRenderer.js導出一個包含render方法的對象:

  1. export default { 
  2.   render: (reactElement, domElement, callback) => { 
  3.     // 創建根節點 
  4.     if (!domElement._rootContainer) { 
  5.       domElement._rootContainer = ReactReconcilerInst.createContainer(domElement, false); 
  6.     } 
  7.  
  8.     return ReactReconcilerInst.updateContainer(reactElement, domElement._rootContainer, null, callback); 
  9.   } 
  10. }; 

在項目入口文件,將ReactDOM換成我們實現的CustomRenderer:

  1. import ReactDOM from 'react-dom'
  2. import CustomRenderer from './customRenderer'
  3.  
  4. // 替換ReactDOM 
  5. CustomRenderer.render( 
  6.   <App />, 
  7.   document.getElementById('root'
  8. ); 

實現ReactDOM接下來我們實現hostConfig配置,首先填充空函數避免應用報錯:

  1. const hostConfig = { 
  2.   supportsMutation: true
  3.   getRootHostContext() {}, 
  4.   getChildHostContext() {}, 
  5.   prepareForCommit() {}, 
  6.   resetAfterCommit() {}, 
  7.   shouldSetTextContent() {}, 
  8.   createInstance() {}, 
  9.   createTextInstance() {}, 
  10.   appendInitialChild() {}, 
  11.   finalizeInitialChildren() {}, 
  12.   clearContainer() {}, 
  13.   appendInitialChild() {}, 
  14.   appendChild() {}, 
  15.   appendChildToContainer() {}, 
  16.   prepareUpdate() {}, 
  17.   commitUpdate() {}, 
  18.   commitTextUpdate() {}, 
  19.   removeChild() {} 

注意這里唯一一個Boolean類型的配置項supportsMutation,他表示宿主環境的API支持mutation。

這是DOM API的工作方式,比如element.appendChild、element.removeChild。如果是Native環境則不是這種工作方式。

接下來我們來實現這些API。

實現API

這些API可以分為如下幾類。

初始化環境信息

getRootHostContext與getChildHostContext用于初始化上下文信息。

生成DOM節點

  • createInstance用于創建DOM節點
  • createTextInstance用于創建文本節點

可以將createTextInstance實現如下:

  1. createTextInstance: (text) => { 
  2.   return document.createTextNode(text); 

關鍵邏輯的判斷

shouldSetTextContent用于判斷組件的children是否是文本節點,實現如下:

  1. shouldSetTextContent: (_, props) => { 
  2.     return typeof props.children === 'string' || typeof props.children === 'number'
  3. }, 

DOM操作

appendInitialChild用于插入DOM節點,實現如下:

  1. appendInitialChild: (parent, child) => { 
  2.   parent.appendChild(child); 
  3. }, 

commitTextUpdate用于改變文本節點,實現如下:

  1. commitTextUpdate(textInstance, oldText, newText) { 
  2.   textInstance.text = newText; 
  3. }, 

removeChild用于刪除子節點,實現如下:

  1. removeChild(parentInstance, child) { 
  2.   parentInstance.removeChild(child); 

當實現了所有API后,頁面就能正常渲染了:

完整實現的Demo地址見:完整Demo地址[2]

總結

經過本文的學習,我們實現了一個簡易ReactDOM。

如果你想在任何可以繪制UI的環境使用React,都可以利用react-reconciler實現該環境下的React。

比如,Introduction To React Native Renderers[3]教你如何在Native環境實現React。

參考資料

[1]Hello World Custom React Renderer:

https://agent-hunt.medium.com/hello-world-custom-react-renderer-9a95b7cd04bc

[2]完整Demo地址:

https://codesandbox.io/s/quiet-feather-05gvk?file=/src/index.js

[3]Introduction To React Native Renderers:

https://agent-hunt.medium.com/introduction-to-react-native-renderers-aka-react-native-is-the-java-and-react-native-renderers-are-828a0022f433

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2024-12-06 09:58:09

2022-11-29 12:53:36

機器人物理MIT

2019-12-26 14:30:54

LinuxPython硬件

2017-03-02 13:31:02

監控系統

2022-04-08 08:48:16

線上事故日志訂閱者

2011-02-28 09:22:47

SQLite記賬簿

2022-08-09 10:00:57

ViteTypeScripVue3

2024-01-08 13:47:00

代碼分析工具

2012-07-19 13:49:20

2021-06-26 16:24:21

Linux命令系統

2015-07-03 11:27:30

程序員自己神器

2020-06-18 10:36:12

GitHub代碼開發者

2021-04-25 08:58:00

Go拍照云盤

2017-02-14 10:20:43

Java Class解析器

2023-08-31 22:05:02

SAN環境存儲

2022-06-10 14:52:46

開源項目字節跳動

2014-11-10 15:12:46

2021-10-10 12:45:13

編程語言開發

2012-11-09 13:59:45

產品經理產品管理項目管理

2015-09-08 10:32:21

開源項目選擇方式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人第一页 | 操久久| 久久99精品久久久久久 | 国产成人免费在线 | 色婷婷久久久亚洲一区二区三区 | 九色视频网站 | 拍真实国产伦偷精品 | 亚洲精品久久久久中文字幕二区 | 中文字幕欧美一区 | 一区二区三区免费 | 久久国产精品久久久久 | 日韩久久久一区二区 | 亚洲精品美女视频 | 国产精品久久免费观看 | 先锋资源亚洲 | av网站在线免费观看 | 亚洲视频中文字幕 | 午夜免费电影 | 久久精品视频免费看 | 欧美成人性生活 | 亚洲不卡av在线 | 在线观看午夜视频 | 亚洲国产成人在线观看 | 成人深夜小视频 | 精品久久久久久亚洲综合网站 | 中文字幕 亚洲一区 | 久久精品国产99国产精品亚洲 | 欧美区在线| 久久久91精品国产一区二区精品 | 精品熟人一区二区三区四区 | 国产精品久久久久久久久久三级 | av免费网站在线观看 | 久久国产精品一区二区三区 | 成年人黄色免费视频 | 97国产一区二区 | 亚洲综合三区 | 欧美精品一区二区三区在线播放 | 久久精品男人的天堂 | 国产精品美女 | 中文字幕一区二区三区精彩视频 | 亚洲一区二区三区在线视频 |