溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

React元素如何創(chuàng)建和渲染

發(fā)布時(shí)間:2022-03-11 09:07:25 來(lái)源:億速云 閱讀:147 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“React元素如何創(chuàng)建和渲染”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“React元素如何創(chuàng)建和渲染”吧!

React 是一個(gè)用于構(gòu)建用戶界面的 JavaScript 庫(kù)

它包括兩個(gè)庫(kù):react.js react-dom.js

  • react.js:React 的核心庫(kù),提供了 React.js 的核心功能,比如創(chuàng)建 React 組件、組件的生命周期等

  • react-dom.js:提供了和瀏覽器交互的 DOM 功能,比如:將組件渲染到頁(yè)面上

React 和 ReactDOM

我們可以通過(guò)官方提供的 CDN 鏈接引入 react.js 和 react-dom.js 這兩個(gè)庫(kù),從而在 HTML 中使用

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>

React 是 React 庫(kù)的入口。如果你通過(guò)使用 <script> 標(biāo)簽的方式來(lái)加載 React,則可以通過(guò) React 全局變量對(duì)象來(lái)獲得 React 的頂層 API

如果你使用一個(gè) <script> 標(biāo)簽引入 react-dom,所有的頂層 API 都能在全局 ReactDOM 上調(diào)用

先來(lái)看看 React 和 ReactDOM 是什么:

console.log(React)
console.log(ReactDOM)

React

React元素如何創(chuàng)建和渲染

ReactDOM

React元素如何創(chuàng)建和渲染

可以看到是兩個(gè)對(duì)象,并且擁有很多方法,暫時(shí)不必深究每個(gè)方法

React 初體驗(yàn)

首先我們?cè)?html 中引入:react.js react-dom.js

<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

目前我們的代碼寫在 html 中,所以都通過(guò) script 標(biāo)簽引入這兩個(gè)庫(kù)(后續(xù)不再贅述)

接著我們?cè)诮缑嫔咸砑右粋€(gè)根元素:

<div id="root"></div>

如果我們想給這個(gè)根元素添加一段文字比如: Hello,React! ,我們可以這么做:

<div id="root">
    Hello,React!
</div>

現(xiàn)在用 React 的方式來(lái)將這個(gè)標(biāo)題渲染到頁(yè)面上

我們要用到 ReactDOM 提供的 API :ReactDOM.render()

ReactDOM.render("Hello, React!", document.getElementById("root"), () => {
      console.log("渲染完執(zhí)行回調(diào)函數(shù)");
});

事實(shí)上,render 方法接受 3 個(gè)參數(shù):

  • 要渲染的內(nèi)容("Hello, React!")

  • 渲染內(nèi)容的接收容器(此處的根元素)

  • 可選的回調(diào)函數(shù)(回調(diào)函數(shù)會(huì)在內(nèi)容被渲染后執(zhí)行)

創(chuàng)建 React 元素

如果我們想要渲染的內(nèi)容是一個(gè)標(biāo)題 h2 或者一個(gè)段落 p ,甚至是更復(fù)雜的元素嵌套該怎么辦呢

<!-- 比如 -->
<h2>Hello,React!</h2>
<p>第一次學(xué)習(xí)React,太簡(jiǎn)單了吧</p>
<!-- 甚至 -->
<div>
    <header>
        <h2>Hello,React!</h2>
    </header>
    <section>
        <p>第一次學(xué)習(xí)React,太簡(jiǎn)單了吧</p>
    </section>
</div>

React 提供了創(chuàng)建并返回 React 元素的 API:

React.createElement(
  type,
  [props],
  [...children]
)

該方法接受 3 個(gè)參數(shù):

  • type:指定元素類型,比如 'h2'、'p'

  • props:可選參數(shù),元素的屬性值對(duì)對(duì)象,比如

{className: 'bg-red', id: 'title'}

  • 可選參數(shù),元素的子元素

創(chuàng)建元素并渲染到指定容器

const h2 = React.createElement("h2", null, "Hello,React!");
const p = React.createElement("p", null, "第一次學(xué)react,太簡(jiǎn)單了吧");
const header = React.createElement("header", { id: "title" }, h2);
const section = React.createElement("section", null, p);
const div = React.createElement("div", null, header, section);

渲染到根元素:

ReactDOM.render(div, document.querySelector("#root"));

注意

1.render 方法可以接受 createElement 創(chuàng)建的 React 元素作為渲染對(duì)象

2.render 方法屬于 ReactDOM 對(duì)象

3.createElement 方法屬于 React 對(duì)象

JSX

每個(gè) React 元素都用 createElement 創(chuàng)建有點(diǎn)麻煩啊,有沒(méi)有簡(jiǎn)單點(diǎn)的辦法

事實(shí)上,對(duì)于:

const h2 = React.createElement("h2", null, "Hello,React!");
const p = React.createElement("p", null, "第一次學(xué)react,太簡(jiǎn)單了吧");
const header = React.createElement("header", { id: "title" }, h2);
const section = React.createElement("section", null, p);
const div = React.createElement("div", null, header, section);

可以這么寫:

const h2 = <h2>Hello,React!</h2>;
const p = <p>第一次學(xué)react,太簡(jiǎn)單了吧</p>;
const header = (
    <header>
        <h2>Hello,React!</h2>
    </header>
);
const section = (
    <section>
        <p>第一次學(xué)react,太簡(jiǎn)單了吧</p>
    </section>
);
const div = (
    <div>
        <header>
            <h2>Hello,React!</h2>
        </header>
        <section>
            <p>第一次學(xué)react,太簡(jiǎn)單了吧</p>
        </section>
    </div>
);

這種標(biāo)簽語(yǔ)法既不是字符串也不是 HTML

它被稱為 JSX,是 JavaScript 的語(yǔ)法擴(kuò)展

事實(shí)上,每個(gè) JSX 元素一個(gè)語(yǔ)法糖,它們最終還是會(huì)調(diào)用React.createElement(component, props, ...children) 方法來(lái)創(chuàng)建 React 元素。不過(guò)我們寫起來(lái)更加簡(jiǎn)單且直觀

JSX 初體驗(yàn)

我們將所有 createElement 創(chuàng)建的元素改寫成 JSX

得到如下完整 HTML 頁(yè)面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Static Template</title>
  <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
</head>
<body>
  <div id="root"></div>
</body>
<script>
  const h2 = <h2>Hello,React!</h2>;
  const p = <p>第一次學(xué)react,太簡(jiǎn)單了吧</p>;
  const header = (
    <header>
      <h2>Hello,React!</h2>
    </header>
  );
  const section = (
    <section>
      <p>第一次學(xué)react,太簡(jiǎn)單了吧</p>
    </section>
  );
  const div = (
    <div>
      <header>
        <h2>Hello,React!</h2>
      </header>
      <section>
        <p>第一次學(xué)react,太簡(jiǎn)單了吧</p>
      </section>
    </div>
  );
  ReactDOM.render(div, document.querySelector("#root"));
</script>
</html>

在瀏覽器中打開(kāi),會(huì)發(fā)現(xiàn)頁(yè)面上的元素并沒(méi)有得到正確的渲染

并且控制臺(tái)輸出了錯(cuò)誤:Uncaught SyntaxError: Unexpected token '<'

這是因?yàn)闉g覽器并不認(rèn)識(shí) JSX,JSX 只是 React 團(tuán)隊(duì)自己造的東西,我們需要把 JSX 轉(zhuǎn)換成符合 JS 規(guī)范的語(yǔ)法,這樣瀏覽器就認(rèn)識(shí)了

這跟將 ES6 語(yǔ)法轉(zhuǎn)換成 ES5 差不多

什么東西能把 ES6 語(yǔ)法轉(zhuǎn)換成 ES5 ?

沒(méi)錯(cuò),Babel

同樣,借助 Babel 我們可以將 JSX 轉(zhuǎn)換成 JS 語(yǔ)法

在頁(yè)面中添加如下 script 標(biāo)簽

<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

并將 script 標(biāo)簽(指包含 JSX 語(yǔ)法的 script)的 type 屬性改為:text/babel

<script type="text/babel">
  const h2 = <h2>Hello,React!</h2>;
</script>

現(xiàn)在,元素可以正確的顯示了

感謝各位的閱讀,以上就是“React元素如何創(chuàng)建和渲染”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)React元素如何創(chuàng)建和渲染這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI