前文中我們講解了利用 ReactElement 來編寫React程式,但是我們也看到這種方式編寫 React 特別的麻煩,而且層級結構特別不清晰。今天我們來看一種優雅的編寫React的程式碼的一種方式 JSX。
JSX
JSX就是把 js 和 xml 結合起來編寫程式的一種格式,簡單的說就是給我們的 JS 新增了 XML 的語法擴充套件。有了 JSX 之後,可以幫助我們在編寫模板的時候結構更加簡單清晰。 我們可以對比一下,我們們使用 ReactElement 和 JSX 編寫同一個結構時的區別,大家就會喜歡上 JSX;
利用 ReactElement 編寫的結構
let Title = React.createElement("h1",null,"頁面標題");
let Header = React.createElement("header",null,Title);
let Sider = React.createElement("aside",null,"側邊欄");
let Content = React.createElement("article",null,"頁面內容"); let Main = React.createElement("div",null,Sider,Content);
let Footer = React.createElement("footer",null,"頁面底部");
let Page = React.createElement( "div", null,
Header,
Main,
Footer);
ReactDOM.render(
Page,
document.getElementById("root")
);
複製程式碼
利用 JSX 編寫的結構
ReactDOM.render(
<div>
<header>
<h1>頁面標題</h1>
</header>
<div>
<aside>側邊欄</aside>
<article>頁面內容</article>
</div>
<footer>頁面底部</footer>
</div>
document.getElementById("root")
);
複製程式碼
從上述示例中我們看到在 JSX 中我們可以直接使用我們熟悉的 HTML 標籤來書寫我們的模板,這樣的話結構層級非常清晰,也便於我們維護,當然上手也更便捷。
JSX 使用時的注意事項
在使用 JSX 中,不能巢狀多個同級標籤,一定要在外邊加一個父級 使用 JSX 時,我們需要使用 Babel 來進行編譯,所以必須引入 Babel 並且在 script 上 新增 type="text/babel" 來提示 babel 編譯我們 script 中的程式碼,如下所示:
<script type="text/babel">
ReactDOM.render(
<div>
<h1>hello world</h1>
<p>注意 type 另外 必須有一個父標籤包裹</p>
</div>,
document.getElementById("root")
);
</script>
複製程式碼
使用 JSX 時,當我們要寫的是一個 HTML 標籤時,請全部小寫 使用 JSX 時,所有標籤都必須閉合單標籤 <單標籤 /> 也一樣必須閉合
插值表示式
當我們需要在 JSX 中插入一個js資料時,我們就需要使用插值表示式。 在 JSX 中,讀到{} 時,它就會認為你要插入一條js資料,這個 {} 就是插值表示式,使用示例如下:
let a = "hello";
let b = "React";
ReactDOM.render(
<h1>{a + b}</h1>,
document.getElementById("root")
);
複製程式碼
插值表示式在什麼時候使用
當我們需要在 JSX 中使用 JS 中的資料的時候,我們就需要使用差值表示式 當我們要在 JSX 中新增 註釋的時候,也需要使用插值表示式 {/* 在這裡寫JSX的註釋 */}
使用插值表示式時的注意事項
{}中,接收一個 JS 表示式,可以是我們的算術表示式,變數 或函式呼叫, 最終 {} 接收的是表示式 計算的結果 {}中,接收的是 函式呼叫時,該函式需要由返回值 {}中,不能寫 if else 以及 switch 這些流程控制語句,但是可以使用三目表示式 來進行判斷,示例如下:
let a = 10;
let b = 20;
ReactDOM.render(
<h1>{a > b?"正確":"錯誤"}</h1>,
document.getElementById("root")
);
複製程式碼
{}中,不能寫 for 或者 whlie 這些迴圈語句,可以使用陣列方法代替,示例如下:
let arr = [
"這是第一項",
"這是第二項",
"這是第三項"
]
ReactDOM.render(
<ul>
{arr.map((item,index)=>{
/* 當我們要向 JSX 中新增一組元素時,一定要設定 key 屬性,具體內容 我們會在後邊的文章中講到 */
return <li key={index}>{item}</li>
})}
</ul>,
document.getElementById("root")
);
複製程式碼
不同型別資料在插值表示式中的資料輸出
字串、數字:原樣輸出
布林值、空、未定義:輸出空值,也不會有錯誤
物件:不能直接輸出,但是可以通過其他方式,Object.values、Object.keys 等方法去解析物件
陣列:支援直接輸出,預設情況下把陣列通過空字串進行拼接
JSX的屬性操作
屬性值加了引號,那麼就是一個普通的屬性書寫方式
ReactDOM.render(
<h1 title="React筆記">React筆記</h1>,
document.getElementById("root")
);
複製程式碼
屬性值可以直接寫成差值表示式
let title = "React筆記"
ReactDOM.render(
<h1 title={title}>React筆記</h1>,
document.getElementById("root")
);
複製程式碼
class:在 JSX 中需要使用 className 屬性去代替 class
ReactDOM.render(
<h1 className="title">React筆記</h1>,
document.getElementById("root")
);
複製程式碼
style:在 JSX 中 style 的值只能是物件 style={{ property : value }}
let style = {
borderBottom: "1px solid #000"
}
ReactDOM.render(
<h1 style={style}>React筆記</h1>,
document.getElementById("root")
);
ReactDOM.render(
<h1 style={{
borderBottom: "1px solid #000"
}}>React筆記</h1>,
document.getElementById("root")
);
複製程式碼
看完了 JSX 的基本操作之後,我們來看一個小例子,如何通過資料來生成一個簡單的檢視
let data = {
title: "巔峰榜·熱歌",
details: [
{
name: "體面",
message: "《前任3:再見前任》電影插曲"
},
{
name: "說散就散",
message: "《前任3:再見前任》電影主題曲"
},
{
name: "BINGBIAN病變 (女聲版) ",
message: "抖音熱門歌曲"
}
]
}
ReactDOM.render(
<section className="box">
<h2 className="title">{data.title}</h2>
<ul className="list">
{data.details.map((item,index)=>{
return (
<li>
<p className="name">{item.name}</p>
<p className="message">{item.message}</p>
</li>
);
})}
</ul>
</section>,
document.getElementById("root")
);
複製程式碼
關於 JSX 的基本使用我們就說到這,在下一章節中我們要說到一個比較重的內容--元件。 當然在 React 中編寫元件的方式也會有多種,我們在下一篇中詳細的說。
——以上是筆者歸納總結,如有誤之處,歡迎指出。
訂閱號ID:Miaovclass
關注妙味訂閱號:“妙味前端”,為您帶來優質前端技術乾貨;