什麼是 JSX? 為什麼要用JSX?
- JSX(JavaScript XML)是一種 JavaScript 的語法擴展,通常與 React 一同使用。它允許開發者在 JavaScript 中使用類似 XML 或 HTML 的語法來撰寫 React 元素,並透過渲染(Render)將其轉譯為實際的 DOM 元素及相對應的事件。這種語法使得 React 組件的描述更直觀、易讀,同時提供了更高效的元素創建方式。
- JSX只是為React element(原生語法)提供語法糖。
- 原生創建React元素語法:React.createElement(component, props, …children)。
- component:React 元素的類型,可以是 HTML 元素名稱(字符串,例如 ‘div’)或 React 組件
- props:元素的屬性(attributes),是一個包含元素屬性及其值的物件。
- …children:元素的子元素,可以是單一元素或一個包含多個子元素的數組。
1 | React.createElement( |
- JSX寫法如下
1 | <div className="info">Hello World</div> |
- 巢狀寫法的案例如下:
- React.createElement寫法
1 | React.createElement( |
- JSX寫法
1 | <div className="container"> |
JSX內部原理及規則
- JSX會在編譯階段被轉譯成對應的 React.createElement 的呼叫,生成一個 JavaScript 物件,這個物件描述了 React 元素的類型、屬性(props),以及子元素。
JSX使用規則如下
使用者定義的元件必須大寫
- 錯誤寫法
1 | import React from 'react'; |
- 正確寫法
1 | import React from 'react'; |
React元件不能使用表達式(只能是大寫字母開頭的變數或函數名)
- 錯誤寫法
1 | import React from 'react'; |
- 正確寫法
- CodePen連結
1 | import React from 'react'; |
顯示如下:
1 | Photo Story: A beautiful photo story |
回傳單一個根元素
- 最外層需要使用父層元素包覆(EX:div、或使用 Fragment (<> 和 </>))
- 案例如下:
1 | import React from 'react'; |
所有標籤都需要結尾標籤
範例如下:
1 | <div></div> |
- 自閉標籤(self-closing)範例如下
1 | <img /> |
JSX特色
Props可以使用Javascript表達式(foo={1 + 2 + 3 + 4})
- Javascript表達式案例如下:
- Codepen連結
1 | function MyComponent(props) { |
顯示如下:
1 | 由App組件傳過來的foo參數:10 |
- if跟for不是表達式不能使用
- 三元運算符(肚子餓了嗎?餓了:還沒餓)及邏輯運算符(&&)算是表達式的一種
- 三元運算符案例如下:
- Codepen連結
1 | import React, { useState } from 'react'; |
- 邏輯運算符(&&)案例如下:
- Codepen連結
1 | import React, { useState } from 'react'; |
顯示如下:
1 | Welcome back! |
純布林值、Null 和未定義值將被忽略(以下案例全部均顯示空白)
1 | <div /> |
屬性展開(…)
1 | const App = () => { |
陣列作為子元素: 你可以使用陣列來傳遞多個子元素
1 | import React, { useState } from 'react'; |
React內聯樣式(inline styles)
- JSX不能使用保留字(會自動轉換成別的字詞避免與保留字衝突)
- class->className
- for->htmlfor(label)
- CSS內聯屬性stroke-width改成駝峰式命名(Camel-Case)strokeWidth
1 | const App = () => { |