JSX 語法的本質目的是為了使用基於 xml 的方式表達組件的嵌套,保持和 HTML 一致的結構,語法上除了在描述組件上比較特別以外,其它和普通的 Javascript 沒有區別。 並且最終所有的 JSX 都會編譯為原生 Javascript。
JSX = JavaScript XML
JSX 是一個看起來很像 XML 的 JavaScript 語法擴展。
特點
- 類XML語法:有固定的標簽開啟和閉合。這能讓復雜的樹更易於閱讀,優於方法調用和對象字面量的形式。
- 增強JS語義:不是模板,模板與頁面是分離的,是字符串,而JSX是JS語法本身,有更多的擴展
- 結構清晰
- 抽象程度高:屏蔽了手動的DOM操作,跨平台-JSX是獨立於平台的語法,React在不同的平台提供解釋器
- 代碼模塊化:MVC是縱向切分,React是橫向切分,大項目由眾多小項目組成
HTML組件 與 React組件
HTML組件和HTML中原生的組件一樣,而React組件是自定義的組件
JSX 中約定以大小寫字母開頭來區分,組件一般以大寫字母開頭
//JSX中支持絕大部分HTML標簽 |
由於 JSX 就是 JavaScript,一些標識符像 class
和 for
不建議作為 XML 屬性名。作為替代,React DOM 使用 className
和 htmlFor
來做對應的屬性。
JSX轉換器
JSX 把類 XML 的語法轉成純粹 JavaScript,XML 元素、屬性和子節點被轉換成 React.createElement
的參數。
React.createElement(HTML標簽名稱/父組件,標簽屬性,子元素)
//JSX語法 |
命名空間式組件
如果一個組件擁有多個子組件,可以將子組件做為父組件的屬性
// 命令空間式組件 |
Javascript表達式
在JSX語法中,使用{}
標識內部是JS表達式
JSX是HTML和JavaScript混寫的語法,當遇到<
,JSX就當HTML解析,遇到{
就當Javascript解析
render(){ |
屬性表達式
在使用 JS表達式 做為屬性時,必須使用 {}
包含在內,不可使用 ""
render(){ |
子表達式
組件嵌套中同樣可以使用 JS表達式 來處理組件的顯示邏輯
render(){ |
注釋 (Comments)
注釋作用於源碼,對源碼做說明,不會出現實在渲染后的DOM中
var content = ( |
延展屬性(Spread Attributes)
組件的屬性應當在組件初始化時指定,而不應在初始化以后指定,這樣會導致 props 對象的修改不可預測, React 也不能幫助檢查屬性類型。
//better |
屬性延展是將一個對象添加為組件的屬性的語法糖
操作符 ...
是ES6中的延展語法(spread operator),可以將一個對象展開
var props = { foo: x, bar: y }; |
注意:后面相同的屬性覆蓋掉前面的屬性
JSX陷阱
style屬性
style屬性是用兩個 {
包含的,最外層的 {
表示內部是一個JS表達式,里面的 {
表示是一個JS對象字面量
render(){ |
HTML轉義
React 默認會轉義所有字符串,為了防止各種 XSS 攻擊。
可使用 __html
進行轉義
var content='<strong>content</strong>'; |
標簽閉合
在JSX中,無論是單標簽還是成對的雙標簽,必有閉合符,不然會報錯
render(){ |
根節點
自定義組件在render()
函數中返回的組件內容,必須有一個根節點包含起來
// bad |
循環遍歷
通過循環遍歷出生成的組件集合,在循環時一定要加上key
值
|
IF-ELSE
在JSX中是不可以直接在{}
中加入if-else
的
- 使用 三元操作符 來替代
if-else
,或者將復雜的操作在JSX外面使用JS去處理 - 使用閉包自執行函數
//錯誤的寫法 |
Show-Hide
class App extends React.Component{ |
Switch-Case
return ( |
Loop:循環
var rows = []; |
相關示例