JSX的本質(zhì)

先看一下JSX的常見寫法

<script type="text/babel">
  const ele = <h2>Hello React!</h2>
    ReactDOM.render(ele, document.getElementById("app"));
</script>

JSX是語法糖,通過babel轉(zhuǎn)成React.createElement函數(shù),在babel官網(wǎng)上可以在線把JSX轉(zhuǎn)成React的JS語法

JSX語法糖


script標(biāo)簽中不添加text/babel解析jsx語法的情況下:

<script>
  const ele = React.createElement("h2", null, "Hello React!");
  ReactDOM.render(ele, document.getElementById("app"));
</script>

JSX的本質(zhì)是React.createElement()函數(shù)

最后一個參數(shù)并未寫成可變參數(shù)的形式,為什么可以傳入多個參數(shù)呢?


把右側(cè)React的代碼格式化一下:

/*#__PURE__ 根元素div*/
React.createElement("div", null, 
        /*第一個子元素,header*/
        React.createElement("div",  { className: "header" }, 
                                    React.createElement("h1", { title:"\u6807\u9898"}, "\u6211\u662F\u6807\u9898")
                            ), 
        /*第二個子元素,content*/
        React.createElement("div", { className: "content" }, 
                                React.createElement("h2", null, "\u6211\u662F\u9875\u9762\u7684\u5185\u5BB9"), 
                                React.createElement("button", null, "\u6309\u94AE"), 
                                React.createElement("button", null, "+1"), 
                                React.createElement("a", { href: "http://www.baidu.com" },          
                                                "\u767E\u5EA6\u4E00\u4E0B")
                           ), 
        /*第三個子元素,footer*/
        React.createElement("div", { className: "footer" }, 
                                React.createElement("p", null, "\u6211\u662F\u5C3E\u90E8\u7684\u5185\u5BB9")
                           )
);

根元素中有三個子元素,第二個子元素中也有4個子元素,所以function createElement(type, config, children) {}中的children是對應(yīng)是多個參數(shù),類似可變參數(shù)的寫法。
React實際處理是怎樣的呢?


事實上,JavaScript中參數(shù)在函數(shù)內(nèi)部是以一個數(shù)組表示的,函數(shù)接收的始終是一個數(shù)組,可以通過arguments[n]來獲取對應(yīng)的參數(shù)。
當(dāng)傳入多個參數(shù)時,通過獲取第三個以及以后參數(shù)。

createElement函數(shù)返回的對象是ReactEelement對象。
createElement的寫法如下

class App extends React.Component {
  constructor() {
    super()
    this.state = {}
  }

  render() {
    return React.createElement("div", null,
                               /*第一個子元素,header*/
                               React.createElement("div", { className: "header" },
                                                   React.createElement("h1", { title: "\u6807\u9898" }, "\u6211\u662F\u6807\u9898")
                                                  ),
                               /*第二個子元素,content*/
                               React.createElement("div", { className: "content" },
                                                   React.createElement("h2", null, "\u6211\u662F\u9875\u9762\u7684\u5185\u5BB9"),
                                                   React.createElement("button", null, "\u6309\u94AE"),
                                                   React.createElement("button", null, "+1"),
                                                   React.createElement("a", { href: "http://www.baidu.com" },
                                                                       "\u767E\u5EA6\u4E00\u4E0B")
                                                  ),
                               /*第三個子元素,footer*/
                               React.createElement("div", { className: "footer" },
                                                   React.createElement("p", null, "\u6211\u662F\u5C3E\u90E8\u7684\u5185\u5BB9")
                                                  )
                              );
  }
}

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

實際開發(fā)中不會使用createElement來創(chuàng)建ReactElement的,一般都是使用JSX的形式開發(fā)。

ReactElement在程序中打印一下

render() {
  let ele = (
    <div>
      <div className="header">
        <h1 title="標(biāo)題">我是標(biāo)題</h1>
      </div>
      <div className="content">
        <h2>我是頁面的內(nèi)容</h2>
        <button>按鈕</button>
        <button>+1</button>
        <a >百度一下</a>
      </div>
      <div className="footer">
        <p>我是尾部的內(nèi)容</p>
      </div>
    </div>
  )
  console.log(ele);
  return ele;
}

react通過babelJSX轉(zhuǎn)成createElement函數(shù),生成ReactElement對象,然后通過ReactDOM.render函數(shù)把ReactElement渲染成真是的DOM元素

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容