JSX 到 JS 的轉換


在寫react代碼的時候,大部分同學應該都是寫JSX。因為相比於寫純JavaScript。寫JSX為我們去寫組件,比寫一些在JavaScript當中寫類似於html結構的這種代碼是要方便非常非常多的,他的可閱讀性,可維護性都要高很多的。那么JSX他的魔力在哪里,能夠讓我們在JS里面寫html代碼。

 

JSX相對於JavaScript來講,他的唯一的一個區別就是他可以寫類似於html的標簽。

 

https://www.babeljs.cn/repl 在這個網址寫示例

 

左邊
<div></div>
右邊
"use strict";
React.createElement("div", null);

在左邊我們聲明了html的標簽,他在右邊會返回一個我們在react當中我們需要返回的一個對象。這就是 JSX 到 JS 的一個轉換過程

我們會發現通過這種標簽寫的,他最終都會轉換成 React.createElement 。里面的標簽名,屬性,內容都會通過參數給他。

 

左邊
<div id='div' key='key'>test</div>
右邊
React.createElement("div", {
  id: "div",
  key: "key"
}, "test");

會把所有的屬性放在第二個參數,第二個參數是個對象,都會加在這個對象里面給他。第三個參數在 React 中稱為 children ,也就是標簽內容

 

如果標簽里面也有標簽
左邊
<div id='div' key='key'>
  <span>spanTest</span>
</div>
右邊
React.createElement("div", {
  id: "div",
  key: "key"
}, React.createElement("span", null, "spanTest"));

因為span他也是標簽,所有第三個參數傳內容的地方,再次將標簽轉換成 React.createElement 。

 

再復制一個節點
左邊
<div id='div' key='key'>
  <span>spanTest</span>
  <span>spanTest</span>
</div>
右邊
React.createElement("div", {
  id: "div",
  key: "key"
}, React.createElement("span", null, "spanTest"), 
React.createElement("span", null, "spanTest"));

會發現第三個以后都是節點,多少個節點,后面就多少個 React.createElement 。這就是 JSX 轉換成 JS 的樣子。在這里我們看到第一個參數是個字符串。那么如果這個不是個標簽,是個組件,他會怎么樣呢?

 

左邊
function Comp() {
    return <a>123</a>
}

<Comp id='div' key='key'>
  <span>spanTest</span>
  <span>spanTest</span>
</Comp>

右邊

function Comp() {
  return React.createElement("a", null, "123");
}

React.createElement(Comp, {
  id: "div",
  key: "key"
}, React.createElement("span", null, "spanTest"), React.createElement("span", null, "spanTest"));

這個時候發現就不再是字符串,而是以變量的方式傳遞進來。值得注意的是。在目前的babel插件里面,在轉化的過程當中,會根據大小寫判斷。小寫認為是原生的html標簽,就是以字符串的形式傳遞,如果是大寫,就認為是組件,當做變量傳遞

 

React.createElement 我們就從來不會寫到,但是我們用到的是最多的





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM