精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:說說React Jsx轉換成真實DOM過程?

開發 前端
react通過將組件編寫的JSX映射到屏幕,以及組件中的狀態發生了變化之后 React會將這些「變化」更新到屏幕上。

[[414295]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

react通過將組件編寫的JSX映射到屏幕,以及組件中的狀態發生了變化之后 React會將這些「變化」更新到屏幕上

在前面文章了解中,JSX通過babel最終轉化成React.createElement這種形式,例如:

  1. <div> 
  2.   <img src="avatar.png" className="profile" /> 
  3.   <Hello /> 
  4. </div> 

 

 

會被bebel轉化成如下:

  1. React.createElement( 
  2.   "div"
  3.   null
  4.   React.createElement("img", { 
  5.     src: "avatar.png"
  6.     className: "profile" 
  7.   }), 
  8.   React.createElement(Hello, null
  9. ); 

在轉化過程中,babel在編譯時會判斷 JSX 中組件的首字母:

  • 當首字母為小寫時,其被認定為原生 DOM 標簽,createElement 的第一個變量被編譯為字符串
  • 當首字母為大寫時,其被認定為自定義組件,createElement 的第一個變量被編譯為對象

最終都會通過RenderDOM.render(...)方法進行掛載,如下:

  1. ReactDOM.render(<App />,  document.getElementById("root")); 

二、過程

在react中,節點大致可以分成四個類別:

  • 原生標簽節點
  • 文本節點
  • 函數組件
  • 類組件

如下所示:

  1. class ClassComponent extends Component { 
  2.   static defaultProps = { 
  3.     color: "pink" 
  4.   }; 
  5.   render() { 
  6.     return ( 
  7.       <div className="border"
  8.         <h3>ClassComponent</h3> 
  9.         <p className={this.props.color}>{this.props.name}</p> 
  10.       </div> 
  11.     ); 
  12.   } 
  13.  
  14. function FunctionComponent(props) { 
  15.   return ( 
  16.     <div className="border"
  17.       FunctionComponent 
  18.       <p>{props.name}</p> 
  19.     </div> 
  20.   ); 
  21.  
  22. const jsx = ( 
  23.   <div className="border"
  24.     <p>xx</p> 
  25.     <a href="https://www.xxx.com/">xxx</a> 
  26.     <FunctionComponent name="函數組件" /> 
  27.     <ClassComponent name="類組件" color="red" /> 
  28.   </div> 
  29. ); 

這些類別最終都會被轉化成React.createElement這種形式

React.createElement其被調用時會傳?標簽類型type,標簽屬性props及若干子元素children,作用是生成一個虛擬Dom對象,如下所示:

  1. function createElement(type, config, ...children) { 
  2.     if (config) { 
  3.         delete config.__self; 
  4.         delete config.__source; 
  5.     } 
  6.     // ! 源碼中做了詳細處理,⽐如過濾掉key、ref等 
  7.     const props = { 
  8.         ...config, 
  9.         children: children.map(child => 
  10.    typeof child === "object" ? child : createTextNode(child) 
  11.   ) 
  12.     }; 
  13.     return { 
  14.         type, 
  15.         props 
  16.     }; 
  17. function createTextNode(text) { 
  18.     return { 
  19.         type: TEXT, 
  20.         props: { 
  21.             children: [], 
  22.             nodeValue: text 
  23.         } 
  24.     }; 
  25. export default { 
  26.     createElement 
  27. }; 

createElement會根據傳入的節點信息進行一個判斷:

  • 如果是原生標簽節點, type 是字符串,如div、span
  • 如果是文本節點, type就沒有,這里是 TEXT
  • 如果是函數組件,type 是函數名
  • 如果是類組件,type 是類名

虛擬DOM會通過ReactDOM.render進行渲染成真實DOM,使用方法如下:

  1. ReactDOM.render(element, container[, callback]) 

當首次調用時,容器節點里的所有 DOM 元素都會被替換,后續的調用則會使用 React 的 diff算法進行高效的更新

如果提供了可選的回調函數callback,該回調將在組件被渲染或更新之后被執行

render大致實現方法如下:

  1. function render(vnode, container) { 
  2.     console.log("vnode", vnode); // 虛擬DOM對象 
  3.     // vnode _> node 
  4.     const node = createNode(vnode, container); 
  5.     container.appendChild(node); 
  6.  
  7. // 創建真實DOM節點 
  8. function createNode(vnode, parentNode) { 
  9.     let node = null
  10.     const {type, props} = vnode; 
  11.     if (type === TEXT) { 
  12.         node = document.createTextNode(""); 
  13.     } else if (typeof type === "string") { 
  14.         node = document.createElement(type); 
  15.     } else if (typeof type === "function") { 
  16.         node = type.isReactComponent 
  17.             ? updateClassComponent(vnode, parentNode) 
  18.         : updateFunctionComponent(vnode, parentNode); 
  19.     } else { 
  20.         node = document.createDocumentFragment(); 
  21.     } 
  22.     reconcileChildren(props.children, node); 
  23.     updateNode(node, props); 
  24.     return node; 
  25.  
  26. // 遍歷下子vnode,然后把子vnode->真實DOM節點,再插入父node中 
  27. function reconcileChildren(children, node) { 
  28.     for (let i = 0; i < children.length; i++) { 
  29.         let child = children[i]; 
  30.         if (Array.isArray(child)) { 
  31.             for (let j = 0; j < child.length; j++) { 
  32.                 render(child[j], node); 
  33.             } 
  34.         } else { 
  35.             render(child, node); 
  36.         } 
  37.     } 
  38. function updateNode(node, nextVal) { 
  39.     Object.keys(nextVal) 
  40.         .filter(k => k !== "children"
  41.         .forEach(k => { 
  42.         if (k.slice(0, 2) === "on") { 
  43.             let eventName = k.slice(2).toLocaleLowerCase(); 
  44.             node.addEventListener(eventName, nextVal[k]); 
  45.         } else { 
  46.             node[k] = nextVal[k]; 
  47.         } 
  48.     }); 
  49.  
  50. // 返回真實dom節點 
  51. // 執行函數 
  52. function updateFunctionComponent(vnode, parentNode) { 
  53.     const {type, props} = vnode; 
  54.     let vvnode = type(props); 
  55.     const node = createNode(vvnode, parentNode); 
  56.     return node; 
  57.  
  58. // 返回真實dom節點 
  59. // 先實例化,再執行render函數 
  60. function updateClassComponent(vnode, parentNode) { 
  61.     const {type, props} = vnode; 
  62.     let cmp = new type(props); 
  63.     const vvnode = cmp.render(); 
  64.     const node = createNode(vvnode, parentNode); 
  65.     return node; 
  66. export default { 
  67.     render 
  68. }; 

三、總結

在react源碼中,虛擬Dom轉化成真實Dom整體流程如下圖所示:

其渲染流程如下所示:

  • 使用React.createElement或JSX編寫React組件,實際上所有的 JSX 代碼最后都會轉換成React.createElement(...) ,Babel幫助我們完成了這個轉換的過程。
  • createElement函數對key和ref等特殊的props進行處理,并獲取defaultProps對默認props進行賦值,并且對傳入的孩子節點進行處理,最終構造成一個虛擬DOM對象
  • ReactDOM.render將生成好的虛擬DOM渲染到指定容器上,其中采用了批處理、事務等機制并且對特定瀏覽器進行了性能優化,最終轉換為真實DOM

參考文獻

https://bbs.huaweicloud.com/blogs/265503)

https://huang-qing.github.io/react/2019/05/29/React-VirDom/

 

https://segmentfault.com/a/1190000018891454

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-06-29 09:47:34

ReactSetState機制

2021-06-30 07:19:36

React事件機制

2021-08-02 08:34:20

React性能優化

2021-09-14 07:06:13

React項目TypeScript

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構

2021-07-07 08:36:45

React應用場景

2021-08-03 07:51:43

React項目面試

2024-02-29 16:49:20

volatileJava并發編程

2024-11-19 15:13:02

2024-08-29 16:30:27

2023-12-27 18:16:39

MVCC隔離級別幻讀

2024-08-12 17:36:54

2025-04-16 00:00:01

JWT客戶端存儲加密令

2025-04-08 00:00:00

@AsyncSpring異步

2021-08-03 08:41:18

SQLMysql面試

2021-05-19 08:40:36

DNS 協議查詢

2021-07-13 07:52:03

ReactHooks組件

2024-03-14 14:56:22

反射Java數據庫連接
點贊
收藏

51CTO技術棧公眾號

中文字幕制服丝袜在线| 模特精品在线| 欧美日韩高清不卡| 色吧亚洲视频| 性欧美18一19性猛交| 98精品视频| 亚洲激情第一页| 蜜桃免费在线视频| 91福利在线视频| 国产米奇在线777精品观看| 欧美美女18p| 国产熟女一区二区| 97超碰成人| 色噜噜久久综合| 国产日韩亚洲欧美在线| caoporn国产精品免费视频| 国产精品香蕉一区二区三区| 国产97在线|亚洲| 免费一级肉体全黄毛片| 欧美人与动xxxxz0oz| 欧美日本不卡视频| 久热免费在线观看| av漫画网站在线观看| 99久久综合精品| 亚洲aaa激情| 国产美女www| 一区二区三区国产盗摄| 欧美成人精品在线| 精品国产无码在线观看| 精品视频在线播放一区二区三区| 91久久精品一区二区| 国产精品无码人妻一区二区在线| 成人三级黄色免费网站| 9色porny自拍视频一区二区| 91入口在线观看| 国产一区二区三区视频免费观看| 天堂在线亚洲视频| 国语自产在线不卡| 动漫性做爰视频| 日本道不卡免费一区| 亚洲免费人成在线视频观看| 稀缺呦国内精品呦| 久久伦理中文字幕| 91麻豆精品国产自产在线观看一区| 国产成人精品无码播放| 国产精品专区免费| 精品成人乱色一区二区| 国产精品久久久久7777| 日韩欧美一起| 亚洲精品精品亚洲| 欧美另类videosbestsex日本| 尤物在线视频| 国产欧美一区视频| 日本视频一区二区不卡| 番号集在线观看| 中文字幕精品一区二区三区精品| 日本高清不卡一区二区三| 五十路在线视频| 91丨九色丨黑人外教| 国产91精品入口17c| 韩国av在线免费观看| 成人一级片在线观看| 国产精品一区二区a| 六月丁香综合网| 国产二区国产一区在线观看| 97超级碰在线看视频免费在线看| 欧美日韩偷拍视频| 亚洲香蕉网站| 欧美精品第一页在线播放| 国产精品1234区| 免播放器亚洲| 国产精品流白浆视频| 国产美女免费视频| 国产69精品一区二区亚洲孕妇| 国产精品三区四区| 天堂在线中文资源| 久久久久久久久伊人| 无遮挡亚洲一区| 国产美女在线观看| 亚洲综合色丁香婷婷六月图片| 日韩国产一级片| 新版的欧美在线视频| 午夜不卡av免费| 成年人视频网站免费观看| 欧美性suv| 欧美一区二区三区免费观看视频| 少妇被狂c下部羞羞漫画| 91久久精品无嫩草影院| 日韩精品专区在线| 亚洲av网址在线| 欧美综合在线视频观看 | 日韩欧美国产综合在线| 美女尤物在线视频| 欧美在线你懂的| 不卡中文字幕在线观看| 电影91久久久| 欧美精品一区二区三区视频| 国产综合精品久久久久成人av| 欧美日韩国产高清| 国产极品jizzhd欧美| aaa一区二区三区| 岛国av在线一区| 亚洲乱码国产乱码精品天美传媒| 激情影院在线观看| 亚洲欧美色综合| 亚洲国产精品久久久久久女王| 手机在线免费av| 欧美性生活大片视频| 色男人天堂av| 国产一区二区三区探花| 久久久久久久一区二区| 91激情在线观看| 91蝌蚪国产九色| 日韩久久在线| a国产在线视频| 91麻豆精品国产无毒不卡在线观看| 国产三级视频网站| 国精品一区二区| 国产精品无av码在线观看| 蜜桃视频久久一区免费观看入口| 国产日韩欧美一区二区三区综合| 91精品国产91久久久久麻豆 主演| 中文字幕成人| 一本色道久久综合狠狠躁篇的优点| 成人免费毛片东京热| 久久精品国产免费看久久精品| 久久99精品久久久久久三级| 亚洲乱亚洲乱妇| 91国产免费看| 黑人巨大精品欧美| 国产精品v日韩精品v欧美精品网站| 日韩av成人在线观看| 国产成人精品a视频| 亚洲欧洲无码一区二区三区| 婷婷丁香激情网| 你微笑时很美电视剧整集高清不卡| 欧美—级a级欧美特级ar全黄| a毛片在线免费观看| 亚洲图片欧美激情| 欧美男女交配视频| 亚洲欧洲色图| 欧美亚洲另类视频| 五月婷婷综合久久| 天天av天天翘天天综合网色鬼国产| www.五月天色| 在线观看日韩| 91九色对白| 手机在线免费看av| 亚洲国产精品久久久久| www青青草原| 国产美女在线精品| 国产自产在线视频| 国产三级精品三级在线观看国产| 久久久久久美女| 午夜成人免费影院| 日韩欧美国产网站| 天天插天天射天天干| 在线亚洲自拍| 茄子视频成人在线观看| 88xx成人永久免费观看| 中文字幕av一区| 欧美性受xxx黑人xyx性爽| 欧美国产1区2区| 久久人人爽av| 91亚洲国产| 国产精品永久免费| 羞羞电影在线观看www| 精品99999| 国产在线观看99| 91香蕉视频黄| 99热这里只有精品在线播放| 清纯唯美综合亚洲| 99re视频在线观看| 中文字幕色婷婷在线视频| 亚洲最新中文字幕| 91theporn国产在线观看| 亚洲精品第一国产综合野| 伊人久久一区二区三区| 国产亚洲午夜| 在线观看福利一区| 国产毛片久久久| 国产精品视频导航| 污污视频在线| 亚洲精品永久免费| 国产精品一区二区免费视频| 亚洲激情校园春色| 182在线视频| 蜜臀av在线播放一区二区三区| 国产女人18毛片| 你懂的一区二区三区| 97超碰人人看人人| 欧美电影网站| www.xxxx精品| 头脑特工队2在线播放| 欧美日韩亚洲综合| 黄色一级视频免费观看| 国产亚洲精品免费| 中文字幕在线观看91| 日韩精品高清不卡| 无码av天堂一区二区三区| 成人看的羞羞网站| 国产精品视频福利| 影视一区二区三区| 韩国国内大量揄拍精品视频| 91精品专区| 日韩成人黄色av| 91麻豆国产视频| 亚洲成人精品在线观看| 国产又黄又粗的视频| 国产伦精品一区二区三区免费| 欧美丰满熟妇bbbbbb百度| 性欧美欧美巨大69| 日韩一二三区不卡在线视频| 免费成人蒂法| 99高清视频有精品视频| 日日夜夜综合| 国产精品久久久久久久久久尿 | 亚洲色图21p| 日韩三级视频中文字幕| 亚洲性在线观看| 色狠狠一区二区三区香蕉| 国产污视频在线看| 一区二区三区在线观看国产| 99久久99久久精品免费看小说.| xnxx国产精品| 国产人妻人伦精品1国产丝袜| 国产一区视频导航| 欧美伦理片在线观看| 三级一区在线视频先锋| 激情综合在线观看| 99精品99| 视频一区二区在线| 精品国产一区二区三区小蝌蚪 | 91成人免费在线| 日本一区二区免费电影| 亚洲视频狠狠干| 日本不卡一二区| 亚洲欧洲色图综合| 在线观看黄网址| 国产精品嫩草99a| www久久久久久久| 中文字幕免费在线观看视频一区| 精品人妻无码一区| 中文字幕av一区二区三区高| 成人黄色a级片| 91在线一区二区三区| 中文字幕在线播放一区二区| 日韩福利电影在线| 天天干天天玩天天操| 久久精品国产一区二区| www.cao超碰| 精品一区二区三区免费毛片爱| 亚洲欧洲日本精品| 久久99在线观看| 午夜天堂在线视频| 另类小说欧美激情| 亚洲综合av在线播放| 国产一区二区三区四| 中文字幕制服丝袜| av一区二区不卡| 在线免费观看污视频| 不卡的av在线| 亚洲激情 欧美| www.欧美日韩| 国产中年熟女高潮大集合| 久久久久久久精| 少妇高潮惨叫久久久久| 日韩美女啊v在线免费观看| 天天操天天舔天天射| 国产精品沙发午睡系列990531| 国产极品美女在线| 午夜影视日本亚洲欧洲精品| 狠狠狠狠狠狠狠| 欧美一级一级性生活免费录像| 成人午夜视频一区二区播放| 精品中文字幕久久久久久| 国产福利第一视频在线播放| www.亚洲免费视频| 性欧美高清come| 91福利视频在线观看| 桃花岛tv亚洲品质| 国产精品视频地址| 精品综合久久88少妇激情| 国产亚洲一区二区三区在线播放| 人妖一区二区三区| 伊人色综合影院| 亚洲视频碰碰| 欧美xxxxx在线视频| 国产麻豆9l精品三级站| 欧美性xxxx图片| 欧美激情一区二区三区不卡 | 国产十八熟妇av成人一区| 99久久精品国产一区二区三区| 国产一区二区三区视频播放| 激情懂色av一区av二区av| 一级片aaaa| 亚洲精品综合久久中文字幕| 4438x成人网全国最大| 欧美亚洲国产视频小说| 亚洲精品一区国产| 日本一区二区三区视频免费看| 欧美精选一区| 在线黄色免费观看| 91免费视频网| 免费视频一二三区| 欧美高清一级片在线| 青青免费在线视频| 在线看日韩av| 中文字幕资源网在线观看免费| 国产精品入口福利| 久久97精品| 色一情一乱一乱一区91| 日韩精品一卡二卡三卡四卡无卡| 午夜不卡久久精品无码免费| 国产精品麻豆网站| 波多野结衣网站| 日韩激情av在线播放| 牛牛精品视频在线| 91最新在线免费观看| 精品一区二区三区在线 | 亚洲欧美成人一区二区在线电影| 色在线视频网| 91久久久久久久久久久| 欧美午夜精品一区二区三区电影| av免费观看网| hitomi一区二区三区精品| 久久97人妻无码一区二区三区| 在线亚洲欧美专区二区| 内衣办公室在线| 欧美一区二区色| ady日本映画久久精品一区二区| 日本一道在线观看| 国产一区二区三区黄视频 | 亚洲区自拍偷拍| 偷拍一区二区三区| 免费看av毛片| 久久99精品久久久久久青青91| 精品国产伦一区二区三区观看说明| 天堂精品视频| 日韩高清一级片| www.涩涩爱| 欧美日韩不卡一区| 国产精品扒开做爽爽爽的视频| 91深夜福利视频| 欧美独立站高清久久| www.这里只有精品| 中文字幕一区二区三区不卡 | 久久国产欧美日韩精品| 亚洲精品乱码久久久久久蜜桃图片| 五月婷婷另类国产| 日韩一卡二卡在线| 午夜伦理精品一区| 亚洲精品**不卡在线播he| 亚洲精品无码久久久久久| 久久综合狠狠综合| 丰满人妻一区二区三区四区| 日韩中文av在线| 亚洲精品国产九九九| 日韩av在线第一页| 国产女同性恋一区二区| 一卡二卡三卡在线观看| 欧美精品生活片| 国产精品一区二区中文字幕| 91黄色小网站| 中文字幕一区二区三区蜜月| 亚洲精品国产精| 久久久久久亚洲精品不卡| 成人在线视频你懂的| 99er在线视频| 久久久精品人体av艺术| 中文字幕日韩第一页| 精品国产一区二区三区久久狼黑人| 一区在线不卡| 欧美日韩性生活片| 国产日本欧美一区二区| 国产乱码一区二区| 午夜精品久久久久久99热软件| 国产伦精品一区二区三区视频| 亚洲欧美激情网| 亚洲精品国产高清久久伦理二区| a天堂中文在线观看| 欧美性受xxxx白人性爽| 久久在线视频免费观看| 精品熟女一区二区三区| 欧美三级视频在线| 超级碰碰不卡在线视频| 色中色综合成人| 成人动漫av在线| 在线视频欧美亚洲| 97视频免费看| 日韩精品一区二区久久| 日批视频在线看| 黑人精品xxx一区一二区| 伦xxxx在线| 国产中文一区二区| 久久精品免费观看| 天天干天天色综合| 欧美激情一区二区三区在线视频观看| 真实原创一区二区影院| 亚洲精品综合在线观看|