現(xiàn)在 render() 里的代碼是這樣的:
src/pages/Detail.js
return <p>Hello, {chance.first()}!</p>;
在大括號(hào)里的ES6代碼將會(huì)在編譯時(shí)執(zhí)行命黔,將其返回值填入render鸵熟,所以當(dāng)你每次刷新頁(yè)面都會(huì)看到隨機(jī)的名字绸狐。
不過這段代碼實(shí)際上是一種非常特殊的代碼,稱為表達(dá)式惧财,相對(duì)于另一種可以創(chuàng)建變量或者去執(zhí)行其它類型操作的語(yǔ)句宋税,它粗略的表示它可以直接表示為一個(gè)值。
其實(shí)區(qū)別不大坪圾,不過相信我:這些區(qū)別這很重要晓折。因?yàn)槟阒荒茉贘SX中使用表達(dá)式惑朦,不能使用所有的代碼。比如{this.props.message} 和 {chance.first()}都是合法的漓概,但是下面的代碼就不合法:
{if (chance.first() === 'John') { console.log('Got John');
} else { console.log('Got someone else'); } }
說明一下, === 是JavaScript中推薦的比較兩個(gè)值的運(yùn)算符; 如果你現(xiàn)在用 ==那你得趕緊換了,因?yàn)?=會(huì)對(duì)兩個(gè)對(duì)比的值進(jìn)行轉(zhuǎn)義漾月,===并不會(huì),被稱為嚴(yán)格相等胃珍。
現(xiàn)在你可能會(huì)想:“不允許寫這種代碼真是太好了梁肿,它太難懂了√孟剩”確實(shí)如此栈雳,你不能在JSX中使用if/else語(yǔ)句,但是JavaScript是一種非常松散的類C語(yǔ)言缔莲,意味著它繼承了三元運(yùn)算符來(lái)代替if/else哥纫。
也就是說,有可以在JSX中使用的if/else的替代品痴奏,它有很嚴(yán)格的語(yǔ)法:
src/pages/Detail.js
{chance.first() === 'John' ? console.log('Got John')
: console.log('Got someone else') }
可能加上縮進(jìn)會(huì)更清楚一些:
src/pages/Detail.js
{
chance.first() == 'John'
? console.log('Got John')
: console.log('Got someone else')
}
如果你想的話可以把他加到組件中蛀骇,但這只是演示例子,用完就刪掉了读拆。
兩個(gè)括號(hào)不用解釋擅憔,不過其中有一些新的東西,稱為三元表達(dá)式檐晕,因?yàn)樗怯扇糠纸M成:條件:(chance.first() == 'John')暑诸,如果條件為真則執(zhí)行(console.log('Got John'))
如果條件為假則執(zhí)行(console.log('Got someone else')).
重要的部分是問號(hào)和冒號(hào):條件為真執(zhí)行的語(yǔ)句在問號(hào)后,條件為假執(zhí)行的語(yǔ)句在冒號(hào)后辟灰「鲩牛看起來(lái)有點(diǎn)難以理解不是么,不過只有這樣才能在JSX中使用if/else芥喇,不管你喜不喜歡西采,在接下來(lái)的react代碼里,你會(huì)看到到處都是三元表達(dá)式继控。
更糟糕的是械馆,你會(huì)經(jīng)常看到嵌套的三元表達(dá)式包含著一堆問號(hào)冒號(hào)武通,形成一個(gè)真假樹霹崎。JSX允許這樣,不過我敢肯定日內(nèi)瓦公約都不允許這樣寫,最好別這么做冶忱。
不過在JSX中寫三元表達(dá)式的好處是尾菇,他們的返回值會(huì)直接放到輸出里。比如:
src/pages/Detail.js
render() {
return <p>
{
chance.first() == 'John'
? 'Hello, John!'
: 'Hello, world!'
}
</p>;
}
在這個(gè)例子中,三元表達(dá)式的真假判斷后執(zhí)行的部分只有一個(gè)字符串错沽,這些字符串會(huì)被傳回JSX中, 被渲染成p標(biāo)簽眶拉。
所以準(zhǔn)備好使用這些三元表達(dá)式千埃,而且他們經(jīng)常寫在一行,不過這種寫法很容易被濫用忆植。