亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

React基礎(chǔ)-JSX的本質(zhì)-虛擬DOM的創(chuàng)建過程實例分析

瀏覽:190日期:2022-06-09 17:59:17

JSX的本質(zhì)

實際上,jsx僅僅只是 React.createElement(component, props, ...children) 這個函數(shù)的語法糖。

所有的jsx最終都會被轉(zhuǎn)換成React.createElement的函數(shù)調(diào)用。

createElement需要傳遞三個參數(shù):

參數(shù)一:type

當(dāng)前元素的類型;

如果是標(biāo)簽元素,那么就使用字符串表示, 例如 “div”;

如果是組件元素,那么就直接使用組件的名稱;

參數(shù)二:config

所有jsx中的屬性都在config中以對象的屬性和值的形式存儲;

比如傳入className作為元素的class;

參數(shù)三:children

存放在標(biāo)簽中的內(nèi)容,以children數(shù)組的方式進行存儲;

當(dāng)然,如果是多個元素呢?React內(nèi)部有對它們進行處理,處理的源碼在下方

我們知道默認(rèn)jsx是通過babel幫我們進行語法轉(zhuǎn)換的,所以我們之前寫的jsx代碼都需要依賴babel; 我們可以在babel的官網(wǎng)中快速查看轉(zhuǎn)換的過程: 鏈接: https://babeljs.io/repl/#?presets=react

例如有下面這樣一段jsx代碼

class App extends React.Component {  constructor() {    super()  }  render() {    return (      <div><div className="header">Header</div><div className="content">  <div>Banner</div>    <ul>    <li>輪播圖1</li>    <li>輪播圖2</li>    <li>輪播圖3</li>    <li>輪播圖4</li>    <li>輪播圖5</li>  </ul></div><div className="footer">Footer</div>      </div>    )  }}const app = ReactDOM.createRoot(document.querySelector("#app"))app.render(<App/>)

那么也就是說我們可以自己來編寫React.createElement代碼:

我們沒有通過jsx來書寫了,界面依然是可以正常的渲染。

另外,在我們編寫原生的React情況下,我們就不需要babel相關(guān)的內(nèi)容了(當(dāng)然真實開發(fā)中我們是不會編寫原生的React的)

  • 所以,type="text/babel"可以被我們刪除掉了;
  • 所以,<script src="../react/babel.min.js"></script>也可以被我們刪除掉了;
<div></div><script src="../lib/../lib/react.js"></script><script src="../lib/react-dom.js"></script><script>  class App extends React.Component {    constructor() {      super()    }    render() {      const element = React.createElement("div", null, /*#__PURE__*/React.createElement("div", {  className: "header"}, "Header"), /*#__PURE__*/React.createElement("div", {  className: "content"}, /*#__PURE__*/React.createElement("div", null, "Banner"), /*#__PURE__*/React.createElement("ul", null, /*#__PURE__*/React.createElement("li", null, "\u8F6E\u64AD\u56FE1"), /*#__PURE__*/React.createElement("li", null, "\u8F6E\u64AD\u56FE2"), /*#__PURE__*/React.createElement("li", null, "\u8F6E\u64AD\u56FE3"), /*#__PURE__*/React.createElement("li", null, "\u8F6E\u64AD\u56FE4"), /*#__PURE__*/React.createElement("li", null, "\u8F6E\u64AD\u56FE5"))), /*#__PURE__*/React.createElement("div", {  className: "footer"}, "Footer"));return element    }  }  const app = ReactDOM.createRoot(document.querySelector("#app"))  app.render(React.createElement(App, null))</script>

虛擬DOM的創(chuàng)建過程

我們通過 React.createElement 最終創(chuàng)建出來一個 ReactElement對象:

這個ReactElement對象是什么作用呢?React為什么要創(chuàng)建它呢?

原因是React利用ReactElement對象組成了一個JavaScript的對象樹;

JavaScript的對象樹就是虛擬DOM(Virtual DOM);

如何查看ReactElement的樹結(jié)構(gòu)呢?

我們可以將上面代碼中的jsx返回結(jié)果進行打印;

**而ReactElement最終形成的樹結(jié)構(gòu)就是虛擬DOM (Virtual DOM) **;

虛擬DOM幫助我們從命令式編程轉(zhuǎn)到了聲明式編程的模式

React官方的說法:Virtual DOM 是一種編程理念。

在這個理念中,UI以一種理想化或者說虛擬化的方式保存在內(nèi)存中,并且它是一個相對簡單的JavaScript對象

我們可以通過root.render讓 虛擬DOM 和 真實DOM同步起來,這個過程中叫做協(xié)調(diào)(Reconciliation);

這種編程的方式賦予了React聲明式的API:

你只需要告訴React希望讓UI是什么狀態(tài);

React來確保DOM和這些狀態(tài)是匹配的;

你不需要直接進行DOM操作,就可以從手動更改DOM、屬性操作、事件處理中解放出來;

PS:筆者在進行相關(guān)測試或開發(fā)的時候比較喜歡實用vite搭建vue或react的運行環(huán)境,使用命令 npm init vite@latest 創(chuàng)建基本的項目框架,再進行相關(guān)調(diào)試。

理解虛擬DOM有助于我們更加深入的理解react、vue等框架的運行原理。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产精品天天看特色大片不卡 | 婷婷夜色 | 日本免费久久久久久久网站 | 国产在线观看免费一级 | chinese在线播放91国内 | 国产噜噜噜视频在线观看 | 一级女人毛片人一女人 | 天天色综合三 | 欧美日韩在线精品成人综合网 | 美女性高潮视频 | 亚洲精品久久久久久久福利 | 亚洲国产精品看片在线观看 | 国产一二三区四区乱码2021 | 亚洲第一在线 | 亚洲精品第一第二区 | 91自产国偷拍在线 | 国产无限资源在线观看 | 日本二区在线观看 | 国产欧美日韩中文字幕 | 国产高清a毛片在线看 | 欧美一区二区三区gg高清影视 | 国产成人一区二区精品非洲 | 免费一级毛片在线播放 | 黄色片免费观看网站 | 国产影院在线观看 | 成人开心激情 | 99精品视频一区在线视频免费观看 | 成人免费va视频 | 欧美一区二区三区成人看不卡 | 国产成人一区二区三区精品久久 | 成人午夜性a一级毛片美女 成人午夜性影院视频 | 免费看在线偷拍视频 | 精品国产免费一区二区三区 | 亚洲精品一区亚洲精品 | 全色黄大色大片免费久久老太 | jdav视频在线观看 | 亚洲高清在线视频 | 国产成人a大片大片在线播放 | 亚洲国产综合久久精品 | 亚洲精品国产免费 | 狠狠插入视频 |