精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产+成+人+亚洲欧洲| 欧美性猛片aaaaaaa做受| 99免费在线观看视频| 国产一级片免费观看| 亚洲国产欧美日韩在线观看第一区| 黄色成人av在线| 亚洲午夜在线观看| 丰满熟女一区二区三区| 日韩av在线发布| 久久69精品久久久久久国产越南| 国产xxxx视频| 日韩护士脚交太爽了| 夜夜夜精品看看| 视频一区国产精品| 亚洲黄色片视频| 久久99精品久久久久久动态图| 国内外成人免费激情在线视频网站| 欧美黄色一级生活片| 日韩影片在线观看| 欧美性生活一区| 日韩精品xxxx| 50度灰在线| 欧美国产日韩精品免费观看| 国产欧美综合精品一区二区| 国产精品无码在线播放| 久久综合图片| 88国产精品欧美一区二区三区| 91高清免费观看| 欧美日韩爱爱| 亚洲国产欧美一区二区三区同亚洲 | 国产高清一区| 亚洲人午夜精品| 在线免费观看a级片| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | 午夜精品美女久久久久av福利| 天堂v在线观看| 国产一区二区伦理| 成人欧美一区二区三区黑人| 精品乱码一区内射人妻无码| 国产欧美短视频| 国模私拍视频一区| 久久精品欧美一区二区| 午夜精品国产| 久久97久久97精品免视看| 8v天堂国产在线一区二区| 欧美 另类 交| 91精彩在线视频| 欧美国产精品中文字幕| 日韩欧美在线一区二区| 黄色免费在线播放| 久久精品男人天堂av| 日本10禁啪啪无遮挡免费一区二区 | 欧美成人精品高清在线播放 | 日本黄色中文字幕| 丝瓜av网站精品一区二区 | 欧美成人中文字幕在线| 天天看天天摸天天操| 91精品国产91久久久久久密臀 | 色偷偷88888欧美精品久久久 | 欧美在线视频播放| 日韩无码精品一区二区三区| 日韩亚洲国产精品| 久久国产主播| 亚洲精品电影网站| 91丨porny丨对白| 小说区图片区色综合区| 亚洲乱码一区av黑人高潮| 国产av自拍一区| 日韩欧美大片| 欧美国产高跟鞋裸体秀xxxhd| 亚洲一区二区91| 亚洲一区亚洲| 国产精品久久久久一区二区| 在线观看国产精品视频| 国内精品自线一区二区三区视频| 成人网欧美在线视频| 亚洲第一天堂在线观看| 91啪亚洲精品| 亚洲不卡一卡2卡三卡4卡5卡精品| 国产精品一区二区婷婷| 亚洲人成网站精品片在线观看 | 亚洲第一区色| 日本乱人伦a精品| 中文有码在线播放| 国产精品正在播放| 精品久久久久亚洲| 草草影院在线观看| 一区二区三区在线观看动漫| 免费一级特黄特色毛片久久看| 欧美日韩电影免费看| 欧美日韩国产成人在线91| 四虎国产精品免费| 国产精品一区高清| 久久亚洲精品网站| 亚洲成人第一网站| 国产一本一道久久香蕉| 蜜桃麻豆www久久国产精品| 日本在线视频站| 精品成人av一区| 亚洲一区日韩精品| 欧美三级电影在线| 久久中文字幕在线| 久久久久久久久黄色| 国产成人自拍网| 国产精品色在线观看| 国产精品麻豆va在线播放| av片免费播放| 亚洲国产成人午夜在线一区| 成品人视频ww入口| 日韩五码电影| 国产偷国产偷亚洲清高网站| 黄色a级片在线观看| 午夜影院日韩| 国产精品三区在线| 精品麻豆一区二区三区| 色综合久久九月婷婷色综合| 特黄特色免费视频| 日韩亚洲一区在线| 日本乱人伦a精品| 色一情一乱一区二区三区| 国产精品第五页| 手机看片福利盒子久久| 欧美电影完整版在线观看| 欧美巨乳在线观看| 一级黄色片免费看| 国产色一区二区| 久久久久久久激情| 牛牛影视一区二区三区免费看| 成年无码av片在线| 这里只有精品9| 亚洲国产成人一区二区三区| 欧美黄色一级片视频| 久久97精品| 久久免费福利视频| 亚洲风情第一页| 1000部国产精品成人观看| 欧美婷婷精品激情| 青青一区二区三区| 国产精品白嫩初高中害羞小美女| 亚洲人成色777777老人头| 亚洲午夜一区二区三区| 亚洲熟女一区二区三区| 亚洲一级毛片| 91亚洲精华国产精华| 精品麻豆一区二区三区| 欧美一级高清片在线观看| 日韩一区二区三区四区视频| 蜜桃免费网站一区二区三区 | 99久久久久| 国产深夜精品福利| 精品国产丝袜高跟鞋| 在线成人免费视频| 中文字幕在线2021| 国产黄人亚洲片| 91.com在线| 日韩成人动漫在线观看| 日本亚洲欧洲色α| 91短视频版在线观看www免费| 在线观看日韩毛片| 久久噜噜色综合一区二区| 国内精品视频一区二区三区八戒| 最新不卡av| 日韩欧美一级| 97视频在线观看成人| 邻居大乳一区二区三区| 欧美亚洲动漫另类| 91精品一区二区三区蜜桃| 国产精品18久久久久| 人妻少妇精品久久| 免费电影一区二区三区| 国产精品免费视频xxxx| gogo在线观看| 亚洲精品一区二区三区影院| 久久久精品免费看| 欧美国产日本韩| 手机看片国产精品| 欧美亚洲三级| 中文字幕av日韩精品| 6080成人| 日韩美女毛茸茸| 黄色在线免费| 亚洲国产天堂久久综合| 久久精品国产亚洲av麻豆蜜芽| 中文字幕一区二区三区不卡在线 | 人妻视频一区二区三区| 色先锋资源久久综合| 看黄色录像一级片| av一区二区久久| 中日韩av在线播放| 日韩视频不卡| 最新精品视频| 天天躁日日躁狠狠躁欧美| 91丝袜美腿美女视频网站| 日韩脚交footjobhd| 久久精品国产91精品亚洲| 全国男人的天堂网| 欧美日韩电影一区| 韩国av中文字幕| 亚洲美女在线一区| 第一次破处视频| 国产成人在线视频免费播放| 免费看a级黄色片| 极品av少妇一区二区| 亚洲综合欧美日韩| 亚洲制服一区| 国产呦系列欧美呦日韩呦| 日韩在线激情| 日本一欧美一欧美一亚洲视频| 女子免费在线观看视频www| 一区二区在线免费视频| 日本高清视频在线| 制服丝袜日韩国产| 中文天堂在线播放| 色偷偷一区二区三区| 91高清免费观看| 国产精品女人毛片| 能免费看av的网站| 91在线视频观看| avtt中文字幕| 国产一区91精品张津瑜| 亚洲视频第二页| 久久综合伊人| 狠狠97人人婷婷五月| 欧美日韩三区| 性做爰过程免费播放| 欧洲福利电影| 日韩精彩视频| 日本成人7777| 九色91国产| 久久成人福利| 久久99精品久久久久久久青青日本| 日韩高清二区| 97se视频在线观看| 九九热这里有精品| 国产在线观看91一区二区三区| 91在线无精精品一区二区| 成人免费毛片嘿嘿连载视频…| 8x拔播拔播x8国产精品| 蜜桃视频动漫在线播放| 性色av一区二区咪爱| 888av在线视频| 久久久久亚洲精品国产| av福利导福航大全在线| 久久久久久久久电影| 日本一级理论片在线大全| 久久91精品国产91久久跳| 中文字幕在线观看网站| 欧美高清性猛交| 成人黄色动漫| 日韩av免费在线播放| 色8久久影院午夜场| 国产精品av电影| 国产综合色激情| 成人精品久久一区二区三区| 亚洲三级在线| 91九色蝌蚪嫩草| 成人免费直播在线| 久久精品日产第一区二区三区| 日韩欧美天堂| av噜噜色噜噜久久| 欧美一级三级| 偷拍视频一区二区| 五月久久久综合一区二区小说| 天天爱天天做天天操| 欧美一区影院| 全黄性性激高免费视频| 久久黄色影院| 亚洲福利精品视频| 国产综合久久久久久久久久久久| 永久看看免费大片| 99国产精品久| 国产成人av一区二区三区不卡| 欧美国产1区2区| 九九视频免费看| 精品成人在线视频| 中文字幕无码乱码人妻日韩精品| 69av一区二区三区| 日韩一级免费毛片| 一区二区三区美女xx视频| 高清全集视频免费在线| 国模私拍视频一区| 欧美成人毛片| 国产欧美一区二区三区不卡高清| 欧美军人男男激情gay| 视色,视色影院,视色影库,视色网| 精品99视频| 亚洲欧美日韩三级| 99久久精品免费| 美国一级片在线观看| 亚洲国产精品久久人人爱| 色老头在线视频| 日韩精品中午字幕| 国产毛片av在线| 久久久久久久久亚洲| 国产成人精品一区二三区在线观看 | 国产精品一区免费视频| 国产精品麻豆入口| 亚洲欧洲精品一区二区精品久久久 | 亚洲欧美va天堂人熟伦| 亚洲在线观看免费视频| 成人黄色片在线观看| 亚洲精品一区二区三区99| 成在在线免费视频| 97色在线播放视频| 日本超碰一区二区| 日韩欧美一区二区三区四区| 亚洲性图久久| 91pony九色| 欧美国产日韩a欧美在线观看| 日本一级一片免费视频| 欧美日韩成人在线一区| 激情在线视频| 6080yy精品一区二区三区| 欧美h版在线观看| 亚洲在线视频一区二区| 国产伦理一区| 黄色av电影网站| 亚洲欧美日韩国产综合| 五月婷婷丁香在线| 日韩精品高清在线观看| 国产蜜臀在线| 91手机在线观看| 国产精品91一区二区三区| 中文字幕欧美人妻精品一区| 91日韩在线专区| 97免费在线观看视频| 欧美videos中文字幕| 大片免费在线观看| 91久久久在线| 99久久www免费| 五月天中文字幕在线| 国产精品久久久爽爽爽麻豆色哟哟| 国产亚洲欧美在线精品| 日韩电影中文 亚洲精品乱码| 狂野欧美性猛交xxxxx视频| 亚洲一区二区三区乱码aⅴ| 国产精品福利在线观看播放| jizzzz日本| 中文av一区二区| 18国产免费视频| 宅男66日本亚洲欧美视频| 电影在线观看一区二区| 日韩欧美国产二区| 日本不卡在线视频| 91视频免费在观看| 欧美性视频一区二区三区| 国产成人精品视频ⅴa片软件竹菊| 国内黄色精品| 黄色av免费在线播放| 国产喂奶挤奶一区二区三区| 免费看污视频的网站| 中文字幕日韩欧美| 日本久久久久| 欧美一级特黄aaaaaa在线看片| 国产精品白丝jk黑袜喷水| 久操视频免费在线观看| 亚洲国产又黄又爽女人高潮的| 免费h视频在线观看| 欧美资源一区| 久久精品国产999大香线蕉| 午夜写真片福利电影网| 精品久久久久久综合日本欧美| mm视频在线视频| 欧美精品亚洲| 久久99久国产精品黄毛片色诱| 亚洲成人生活片| 亚洲精品国产美女| 高清av一区| 青青草综合视频| 97超碰欧美中文字幕| 亚洲视频中文字幕在线观看| 久久99久久99精品中文字幕| 澳门成人av| 九色91popny| 一区二区三区欧美| 你懂的在线观看| 91视频免费在线| 国产精品美女| 少妇高潮一区二区三区喷水| 亚洲高清久久网| yw.尤物在线精品视频| 可以在线看黄的网站| 91视频www| 国产强被迫伦姧在线观看无码| 久久人人爽人人爽人人片av高请| 精品日韩在线| 日本人妻一区二区三区| 91福利国产精品| 国产啊啊啊视频在线观看| 青青草国产精品| 国产成人精品免费在线| 91在线视频免费播放| 久久夜色撩人精品| 男男gay无套免费视频欧美| 一级网站在线观看| 91久久精品午夜一区二区| 影院在线观看全集免费观看| 日本一区二区高清视频| 国产91丝袜在线播放0| 欧美高清69hd|