React 的骨架 JSX<轉(zhuǎn)>

為什么需要JSX
JSX 是 Facebook 團隊提出的一個語法方案,可以在 JavaScript 的代碼直接中使用 HTML 標簽來編寫 JavaScript 對象肴熏。其使用的是 XML-like
語法鲁猩,這種語法方案需要通過 JSXTransformer
來進行編譯轉(zhuǎn)換成真實可用的 JavaScript 代碼(React 官方已經(jīng)推薦使用 babel
來代替)盏缤。
React 是基于組件的開發(fā)思想,React 認為一個組件可以是一個完全獨立的沒有任何其他依賴的模塊文件古程。一個組件中可以有自己的樣式(Inline Style)和結(jié)構(gòu)(JSX編寫的HTML)煎殷。
在 React 和 JSX 之前屯伞,一個組件如果要包含 HTML 結(jié)構(gòu)將面臨如下幾個問題:

  1. 組件的 HTML 直接寫在頁面中,那么組件的結(jié)構(gòu)和行為是分離的豪直;

  2. 組件的 HTML 直接用字符串的形勢插入到 JavaScript 代碼中劣摇,那么就會出現(xiàn)一大段的字符串拼接,開發(fā)人員需要很小心的確保字符串拼接時沒有因為少了一個符號而導(dǎo)致整個代碼無法運行弓乙;

  3. 使用 MVC
    分層的思想末融,引入模板引擎,那么該如何引入模板文件的片段呢暇韧;

JSX 很好的解決了這些問題勾习。
基本語法
使用 JSX 來創(chuàng)建一個 HTML 標簽,首字母小寫:
<pre>
var link = <a href="xxx">Hello World!</a>
</pre>
相當(dāng)于調(diào)用了 React.createElement
方法:
<pre>
var link = React.createElement('a', {href: 'xxx'}, 'Hello World!')
</pre>
使用 JSX 來創(chuàng)建一個 Component懈玻,首字母大寫:
<pre>
var HelloWorld = <HelloWorld foo="bar"></HelloWorld>
</pre>
首字母的大小寫有嚴格的區(qū)分巧婶,這樣 JSX 可以很簡單的通過區(qū)分首字母是小寫還是大寫來判斷轉(zhuǎn)換的是 HTML 標簽還是自定義的 Component。
JSX 標簽的標簽都需要有完整的結(jié)束符號涂乌,否則編譯會報錯艺栈。
<pre>
<div></div>
<input type="text"/>
</pre>
變量和邏輯
JSX 中可以通過 {xxx}
來插入一個 JavaScript 變量:
<pre>
var name = 'xiao ming';
<a href="xxx">Hello {name}!</a>
</pre>
沒錯,HTML 語法就是這樣和 JavaScript 語法無縫的結(jié)合湾盒!
如果要在 JSX 中插入一段 JavaScript 代碼湿右,那么一次只能插入一個一次就能執(zhí)行完的語句。
<pre>
var link = <a href="xxx">Hello {if (conditions) {'xiao ming'}}!</a>
</pre>
上面的代碼編譯后會是這樣的:
<pre>
var link = React.createElement( 'a', {href: 'xxx'}, if (conditions) {'xiao ming'})
</pre>
編譯后可以看到明顯存在語法錯誤罚勾,可以使用三元運算符來將條件判斷語句簡化成一個語句:
<pre>
var link = <a href="xxx">Hello {conditions ? 'xiao ming' : ''}!</a>
</pre>
多行語句和根節(jié)點
無論你的 JSX 代碼有多長毅人,每一段代碼都只能有一個根節(jié)點,否則編譯通不過尖殃,因為 React 需要確保一個組件只能有一個根節(jié)點丈莺。
<pre>
// 錯誤的寫法
var btnBox = (
<button>Click me</button>
<p>hello world!</p>
);

// 正確的寫法
var btnBox = (
<div>
<button>Click me</button>
<p>hello world!</p>
</div>
);
</pre>
如果想在 JSX 中添加注釋,需要使用多行注釋的語法并確保其包裹在 {} 中分衫。
<pre>
<div>
<h3> title </h3>
{/*<p>text</p>/*}
</div>
</pre>
關(guān)鍵字沖突
因為 JSX 是直接將 HTML 寫在 JavaScript 代碼中场刑,如果在 HTML 中有的屬性中有 JavaScript 的關(guān)鍵字,必須進行轉(zhuǎn)換蚪战,轉(zhuǎn)換規(guī)則和在 JavaScript 中使用 DOM 的 property 一樣牵现。如 class 需轉(zhuǎn)換成className,for 要轉(zhuǎn)換成 htmlFor邀桑,還有其他的關(guān)鍵字這里不做一一列舉瞎疼。

false in JSX
false 在 JSX 中,會有不同的作用壁畸。
<pre>
<div id={false}>
<input type="text" name="name" value={false} />
<button type="button" name="button" disabled={false}>hello</button>
<p>{false}</p>
</div>
</pre>
id={false} 和 value={false} 都換轉(zhuǎn)換成字符串 false贼急,disabled={false} 是設(shè)置 disabled屬性為 false茅茂,<p>{false}</p> 表示該 p 標簽沒有子元素

Inline Style
上面提到過 React 希望一個組件中可以是獨立的,可以將樣式直接通過 JavaScript 的對象插入到 JSX 中太抓,這樣就可以給一個組件定義樣式了空闲。
<pre>
var paraStyle = {
color: '#fff',
fontSize: '14px'
};
var para = (
<p style={paraStyle}></p>
);
</pre>
在定義樣式的時候,對象的 key 就是樣式的屬性走敌,屬性中如果有中劃線碴倾,需將其換成駝峰式value 就是對應(yīng)的屬性值。對于一些復(fù)雜的偽類選擇器掉丽,以及其他的一些高級的 CSS 特性跌榔,有相應(yīng)的庫可以對其支持。
將樣式通過內(nèi)聯(lián)的形式寫在組件內(nèi)部捶障,雖然有違分離原則僧须,但是其確實解決了因為分離帶來的組件獨立性的問題,雖然是反模式化的项炼,但確確實實解決了一個痛點担平。

命名空間
JSX 中還可以支持組件的命名空間,可以讓組件的層次更清晰芥挣,更語義化驱闷。
<pre>
var Form = React.createClass({ ... });
Form.Row = React.createClass({ ... });
Form.Label = React.createClass({ ... });
Form.Input = React.createClass({ ... });
var App = (
<Form>
<Form.Row>
<Form.Label />
<Form.Input />
</Form.Row>
</Form>
);
</pre>
代碼風(fēng)格建議
為了代碼有更好的可讀性,無論是單行語句還是多行語句空免,都建議使用 () 來包裹 JSX 語句空另。在JSX 中插入 JavaScript 語句的時候盡量不要嵌套太長的三目運算符,JSX 本身就是為了開發(fā)更簡便和更好的維護性蹋砚。如果把 JSX 也寫成一坨一坨可讀性很差的代碼扼菠,實在太不應(yīng)該了。
原載于:雨夜帶刀’s Blog本文鏈接:http://stylechen.com/react-jsx.html
如需轉(zhuǎn)載請以鏈接形式注明原載或原文地址坝咐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末循榆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子墨坚,更是在濱河造成了極大的恐慌秧饮,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽篮,死亡現(xiàn)場離奇詭異盗尸,居然都是意外死亡,警方通過查閱死者的電腦和手機帽撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門泼各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亏拉,你說我怎么就攤上這事扣蜻∧嫖。” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵莽使,是天一觀的道長锐极。 經(jīng)常有香客問我,道長吮旅,這世上最難降的妖魔是什么溪烤? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮庇勃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘槽驶。我一直安慰自己责嚷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布掂铐。 她就那樣靜靜地躺著罕拂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪全陨。 梳的紋絲不亂的頭發(fā)上爆班,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音辱姨,去河邊找鬼柿菩。 笑死,一個胖子當(dāng)著我的面吹牛雨涛,可吹牛的內(nèi)容都是我干的枢舶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼替久,長吁一口氣:“原來是場噩夢啊……” “哼凉泄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚯根,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤后众,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颅拦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒂誉,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年矩距,在試婚紗的時候發(fā)現(xiàn)自己被綠了拗盒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡锥债,死狀恐怖陡蝇,靈堂內(nèi)的尸體忽然破棺而出痊臭,到底是詐尸還是另有隱情,我是刑警寧澤登夫,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布广匙,位于F島的核電站,受9級特大地震影響恼策,放射性物質(zhì)發(fā)生泄漏鸦致。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一涣楷、第九天 我趴在偏房一處隱蔽的房頂上張望分唾。 院中可真熱鬧,春花似錦狮斗、人聲如沸绽乔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽折砸。三九已至,卻和暖如春沙峻,著一層夾襖步出監(jiān)牢的瞬間睦授,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工摔寨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留去枷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓祷肯,卻偏偏與公主長得像沉填,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佑笋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容