借鑒:原著
JSX語(yǔ)法洁仗,像是在Javascript代碼里直接寫(xiě)XML的語(yǔ)法温技,實(shí)質(zhì)上這只是一個(gè)語(yǔ)法糖忿偷,每一個(gè)XML標(biāo)簽都會(huì)被JSX轉(zhuǎn)換工具轉(zhuǎn)換成純Javascript代碼,React 官方推薦使用JSX,當(dāng)然你想直接使用純Javascript代碼寫(xiě)也是可以的剿另,只是使用JSX,組件的結(jié)構(gòu)和組件之間的關(guān)系看上去更加清晰
看代碼:
那么也就是說(shuō)贬蛙,我們寫(xiě)一個(gè)XML標(biāo)簽雨女,實(shí)質(zhì)上就是在調(diào)用React.createElement這個(gè)方法,并返回一個(gè)ReactElement對(duì)象阳准。
查看API:鏈接
這個(gè)方法的第一個(gè)參數(shù)可以是一個(gè)字符串氛堕,表示是一個(gè)HTML標(biāo)準(zhǔn)內(nèi)的元素,或者是一個(gè)ReactClass類型的對(duì)象野蝇,表示我們之前封裝好的自定義組件讼稚。第二個(gè)參數(shù)是一個(gè)對(duì)象,或者說(shuō)是字典也可以绕沈,它保存了這個(gè)元素的所有固有屬性(即傳入后基本不會(huì)改變的值)锐想。從第三個(gè)參數(shù)開(kāi)始,之后的參數(shù)都被認(rèn)作是元素的子元素乍狐。
轉(zhuǎn)化
React JSX將類似XML的語(yǔ)法轉(zhuǎn)化到原生的JavaScript赠摇,元素的標(biāo)簽、屬性和子元素都會(huì)被當(dāng)作參數(shù)傳給React.createElement方法:
JSX轉(zhuǎn)化器
要把帶有JSX語(yǔ)法的代碼轉(zhuǎn)化為純Javascript代碼浅蚪,有多種方式藕帜,對(duì)于內(nèi)聯(lián)與HTML中的代碼或者是未經(jīng)過(guò)轉(zhuǎn)化的外部文件,在script標(biāo)簽中要加上type="text/jsx"惜傲,并引入JSXTransformer.js文件即可洽故,不過(guò)這種方式并不建議在生產(chǎn)環(huán)境使用,建議的方法是在代碼上線前就將代碼轉(zhuǎn)換好盗誊,可以使用npm全局安裝react-tools:
并使用命令行工具轉(zhuǎn)化即可(具體用法可以參考jsx -h):
如果使用自動(dòng)化工具时甚,比如gulp的話,可以使用相應(yīng)插件gulp-react浊伙。
查看;鏈接
HTML 標(biāo)簽 vs. React 組件
React.render方法可以渲染HTML結(jié)構(gòu)长捧,也可以渲染React組件嚣鄙。
渲染HTML標(biāo)簽,聲明變量采用首字母小寫(xiě)
渲染React組件串结,聲明變量采用首字母大寫(xiě)
React 的 JSX 使用大寫(xiě)和小寫(xiě)字母來(lái)區(qū)分本地的組件類和 HTML 標(biāo)簽.
不過(guò)需要注意的是class和for這兩個(gè)屬性哑子,JSX語(yǔ)法最終是要被轉(zhuǎn)換為純Javascript的舅列,所以要和在Javascript DOM中一樣,用className和htmlFor卧蜓。
還有一點(diǎn)是帐要,在創(chuàng)建HTML標(biāo)準(zhǔn)內(nèi)的元素時(shí),JSX轉(zhuǎn)化器會(huì)丟棄那些非標(biāo)準(zhǔn)的屬性弥奸,如果一定要添加自定義屬性榨惠,那么需要在這些自定義屬性之前添加data-前綴
命名空間式組件
比如開(kāi)發(fā)組件的時(shí)候,一個(gè)組件有多個(gè)子組件盛霎,你希望這些子組件可以作為其父組件的屬性赠橙,那么可以像這樣用
這樣你只需將子組件的ReactClass作為其父組件的屬性: