JSX
是React
中特有的東東,全稱 Javascriptのxml
。javascript
它的長相是這樣的html
let jsx = <h1>hello</h1>;
複製代碼
看起來就是一個普通的html標籤不是?嗯。。。慢着。。。看看作左邊,咱們將這個html標籤賦給了一個js變量!java
what!? 這是什麼操做?react
嘿,這就是JSX的功能了。咱們說JSX
的全稱應該翻譯爲Javscriptのxml
(Javscript中的xml),而沒有翻譯成Javascript和xml
,這是由於比起xml/html標籤,這更像是在javascript中擴展了一個功能,它把xml當作變量的值賦給js變量,這是對javascript語法的延伸。數組
另外若是隻考慮JSX的長相,咱們也經常把它稱之爲 jsx tag
。bash
JSX 支持換行dom
let jsx = (
<div>
<h1>hello</h1>
</div>
)
複製代碼
須要注意的是老版本的React若是你換行但沒帶上()
做爲註釋的話,那麼React會自動在=
後填上;
,就會報錯!xss
{}
能幫助咱們更好的描述一個JSX tag
的 屬性
和 children
。函數
一個JSX tag
也能像xml/html 標籤元素同樣擁有不少的屬性,像這樣ui
let jsx = <img src='./xxx...'/>
複製代碼
這個屬性的值能夠是一個固定的字符串,也能夠是一個動態的js變量,但這個js變量必須利用{}
包裹起來。(Vue中這貨稱之爲mustache)
let src = './1.jpg';
let jsx = <img src={src} />
複製代碼
另外{}
其實能包含任何JS表達式(只要有返回值,返回原生js對象除外),甚至是延伸出的JSX tag
。 而且{}
不只能做爲屬性的值,還能做爲一個JSX tag
的子元素(文本或Element)。
let className = 'class1';
let src = './1.jpg';
let element2 = <img src={src} alt='1.jpg'/>;
let element = (
<div className={className}>
{element2} //<----看這裏!!!
</div>
);
複製代碼
咱們說了{}
只能放表達式,什麼樣的不是表達式呢,像這樣的
<div>{let i = 123;i}</div> //<---錯誤的示範!!!會報錯
複製代碼
另外{}
中禁止放置JS對象,會報錯
但{}
中放置null
是不會報錯的,放置null表示什麼都不渲染
{}
中返回的如果一個JSX
,且是一個腳本,{}
會自動將其轉換成普通的字符串防止腳本注入。
一個js變量它並不會管它所接受的JSX tag
內部是否包含了其它JSX tag
,但它有一個原則,那就是它只能接受一個JSX tag
做爲入口。
這意味着若是你給js變量賦值時你得JSX長這樣,就會報錯
let jsx = (
<div></div>
<img />
)
複製代碼
綜上所述JSX中的{}
讓其擁有了相似模板引擎的功能,但它比模板引擎更強大,由於它是javascript語法的延伸:
上面咱們說了這麼多,但實際上JSX
表明了什麼呢?它表明的就是一個DOM元素嗎?
這樣的認知是不大穩妥的,實際上它是對 DOM元素 的一種描述,並非DOM元素自己。
前面所說的JSX tag
們都會在編譯後變成這樣
//編譯前
let jsx = <h1 className="class1">hello</h1>
//編譯後
React.createElement(
'h1' //類型
,{className:'class1'} //標籤屬性鍵值對
,'hello' //children節點
)
複製代碼
而這個React.createElement
函數最會生成一個對象,咱們稱之爲React對象
或則還有一個更高逼格的名稱虛擬DOM
。
{
type: 'h1',
props: {
className: 'class1',
children: 'hello'
}
}
複製代碼
這個react元素是對即將要生成的真實DOM的一種描述,React會根據這個對象的描述渲染出真正的dom元素。
注意: 當只有一個子元素時,children的值是一個字符串或則對象,但存在多個子元素時,則會成變成一個數組,每一個數組中存放着對應的子元素。
ToBeContinue...