一起來學(xué)習(xí)React元素的創(chuàng)建和渲染
React 是一個用于構(gòu)建用戶界面的 JavaScript 庫
它包括兩個庫:react.js
和 react-dom.js
react.js
:React 的核心庫,提供了 React.js 的核心功能,比如創(chuàng)建 React 組件、組件的生命周期等react-dom.js
:提供了和瀏覽器交互的 DOM 功能,比如:將組件渲染到頁面上
React 和 ReactDOM
我們可以通過官方提供的 CDN 鏈接引入 react.js 和 react-dom.js 這兩個庫,從而在 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 庫的入口。如果你通過使用<script>
標(biāo)簽的方式來加載 React,則可以通過React
全局變量對象來獲得 React 的頂層 API如果你使用一個
<script>
標(biāo)簽引入 react-dom,所有的頂層 API 都能在全局ReactDOM
上調(diào)用
先來看看 React 和 ReactDOM 是什么:
console.log(React) console.log(ReactDOM)
React
ReactDOM
可以看到是兩個對象,并且擁有很多方法,暫時不必深究每個方法
React 初體驗(yàn)
首先我們在 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 中,所以都通過 script 標(biāo)簽引入這兩個庫(后續(xù)不再贅述)
接著我們在界面上添加一個根元素:
<div id="root"></div>
如果我們想給這個根元素添加一段文字比如: Hello,React! ,我們可以這么做:
<div id="root"> Hello,React! </div>
現(xiàn)在用 React 的方式來將這個標(biāo)題渲染到頁面上
我們要用到 ReactDOM 提供的 API :ReactDOM.render()
ReactDOM.render("Hello, React!", document.getElementById("root"), () => { console.log("渲染完執(zhí)行回調(diào)函數(shù)"); });
事實(shí)上,render 方法接受 3 個參數(shù):
- 要渲染的內(nèi)容("Hello, React!")
- 渲染內(nèi)容的接收容器(此處的根元素)
- 可選的回調(diào)函數(shù)(回調(diào)函數(shù)會在內(nèi)容被渲染后執(zhí)行)
創(chuàng)建 React 元素
如果我們想要渲染的內(nèi)容是一個標(biāo)題 h1 或者一個段落 p ,甚至是更復(fù)雜的元素嵌套該怎么辦呢
<!-- 比如 --> <h1>Hello,React!</h1> <p>第一次學(xué)習(xí)React,太簡單了吧</p> <!-- 甚至 --> <div> <header> <h1>Hello,React!</h1> </header> <section> <p>第一次學(xué)習(xí)React,太簡單了吧</p> </section> </div>
React 提供了創(chuàng)建并返回 React 元素的 API:
React.createElement( type, [props], [...children] )
該方法接受 3 個參數(shù):
- type:指定元素類型,比如 'h1'、'p'
- props:可選參數(shù),元素的屬性值對對象,比如
{className: 'bg-red', id: 'title'}
- 可選參數(shù),元素的子元素
創(chuàng)建元素并渲染到指定容器
const h1 = React.createElement("h1", null, "Hello,React!"); const p = React.createElement("p", null, "第一次學(xué)react,太簡單了吧"); const header = React.createElement("header", { id: "title" }, h1); 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 元素作為渲染對象
2.render 方法屬于 ReactDOM 對象
3.createElement 方法屬于 React 對象
JSX
每個 React 元素都用 createElement 創(chuàng)建有點(diǎn)麻煩啊,有沒有簡單點(diǎn)的辦法
事實(shí)上,對于:
const h1 = React.createElement("h1", null, "Hello,React!"); const p = React.createElement("p", null, "第一次學(xué)react,太簡單了吧"); const header = React.createElement("header", { id: "title" }, h1); const section = React.createElement("section", null, p); const div = React.createElement("div", null, header, section);
可以這么寫:
const h1 = <h1>Hello,React!</h1>; const p = <p>第一次學(xué)react,太簡單了吧</p>; const header = ( <header> <h1>Hello,React!</h1> </header> ); const section = ( <section> <p>第一次學(xué)react,太簡單了吧</p> </section> ); const div = ( <div> <header> <h1>Hello,React!</h1> </header> <section> <p>第一次學(xué)react,太簡單了吧</p> </section> </div> );
這種標(biāo)簽語法既不是字符串也不是 HTML
它被稱為 JSX,是 JavaScript 的語法擴(kuò)展
事實(shí)上,每個 JSX 元素一個語法糖,它們最終還是會調(diào)用React.createElement(component, props, ...children)
方法來創(chuàng)建 React 元素。不過我們寫起來更加簡單且直觀
JSX 初體驗(yàn)
我們將所有 createElement 創(chuàng)建的元素改寫成 JSX
得到如下完整 HTML 頁面
<!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 h1 = <h1>Hello,React!</h1>; const p = <p>第一次學(xué)react,太簡單了吧</p>; const header = ( <header> <h1>Hello,React!</h1> </header> ); const section = ( <section> <p>第一次學(xué)react,太簡單了吧</p> </section> ); const div = ( <div> <header> <h1>Hello,React!</h1> </header> <section> <p>第一次學(xué)react,太簡單了吧</p> </section> </div> ); ReactDOM.render(div, document.querySelector("#root")); </script> </html>
在瀏覽器中打開,會發(fā)現(xiàn)頁面上的元素并沒有得到正確的渲染
并且控制臺輸出了錯誤:Uncaught SyntaxError: Unexpected token '<'
這是因?yàn)闉g覽器并不認(rèn)識 JSX,JSX 只是 React 團(tuán)隊(duì)自己造的東西,我們需要把 JSX 轉(zhuǎn)換成符合 JS 規(guī)范的語法,這樣瀏覽器就認(rèn)識了
這跟將 ES6 語法轉(zhuǎn)換成 ES5 差不多
什么東西能把 ES6 語法轉(zhuǎn)換成 ES5 ?
沒錯,Babel
同樣,借助 Babel 我們可以將 JSX 轉(zhuǎn)換成 JS 語法
在頁面中添加如下 script 標(biāo)簽
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
并將 script 標(biāo)簽(指包含 JSX 語法的 script)的 type 屬性改為:text/babel
<script type="text/babel"> const h1 = <h1>Hello,React!</h1>; </script>
現(xiàn)在,元素可以正確的顯示了
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
react項(xiàng)目打包后點(diǎn)擊index.html頁面出現(xiàn)空白的問題
這篇文章主要介紹了react項(xiàng)目打包后點(diǎn)擊index.html頁面出現(xiàn)空白的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06React?Native?Modal?的封裝與使用實(shí)例詳解
這篇文章主要介紹了React?Native?Modal?的封裝與使用,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09使用webpack5從0到1搭建一個react項(xiàng)目的實(shí)現(xiàn)步驟
這篇文章主要介紹了使用webpack5從0到1搭建一個react項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12React-Native之定時器Timer的實(shí)現(xiàn)代碼
本篇文章主要介紹了React-Native之定時器Timer的實(shí)現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10基于CSS實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成 React 組件
筆者先后開發(fā)過基于vue,react,angular等框架的項(xiàng)目,碧如vue生態(tài)的elementUI, ant-design-vue, iView等成熟的UI框架, react生態(tài)的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開發(fā)一個項(xiàng)目的成本和復(fù)雜度,使開發(fā)者更專注于實(shí)現(xiàn)業(yè)務(wù)邏輯和服務(wù)化2021-11-11