React - JSX語(yǔ)法詳解(附樣例)

在前文中:React - 功能介紹话告、安裝配置說明(附幾個(gè)簡(jiǎn)單的入門樣例),我演示了如何使用 ReactJS 進(jìn)行頁(yè)面開發(fā)。本文來著重介紹下 JSX乔煞。雖然 React 不強(qiáng)制我們一定要用 JSX熙侍,只用 JavaScript 也可以榄鉴。但使用 JSX 可以讓我們開發(fā)更加高效,代碼更加簡(jiǎn)潔核行。

JSXJavaScript XML牢硅,是一種在React 組件內(nèi)部構(gòu)建標(biāo)簽的類 XML 語(yǔ)法。
JSX 并不是一門新的語(yǔ)言芝雪,僅僅是個(gè)語(yǔ)法糖(syntactic sugar)减余,允許開發(fā)者在 JavaScript 中書寫 HTML 語(yǔ)法。最后惩系,每個(gè) HTML 標(biāo)簽都轉(zhuǎn)化為 JavaScript 代碼來運(yùn)行位岔。
這樣對(duì)于使用 JavaScript 來構(gòu)建組件以及組件之間關(guān)系的應(yīng)用,在代碼層面顯得更加清晰堡牡。而不再像過于一樣用 JavsScript 操作 DOM 來創(chuàng)建組件以及組件之間的嵌套關(guān)系抒抬。

1. 運(yùn)行環(huán)境

  • JSX 必須借助 ReactJS 環(huán)境才能運(yùn)行,所以使用前要先加載 ReactJS 文件(react.js晤柄、react-dom.js
  • 除了 ReactJS 環(huán)境擦剑,還需要加載 JSX 的解析器(browser.js

具體的下載地址和加載方法,參考我之前的文章:React - 功能介紹、安裝配置說明(附幾個(gè)簡(jiǎn)單的入門樣例)

2. 載入方式

JSX 目前有兩種方法載入惠勒。
(1)內(nèi)聯(lián)方式載入

<script type="text/babel">
    ReactDOM.render(
      <h1>hello jianshu.com</h1>,
      document.getElementById('example')
    );
</script>

(2)外聯(lián)方式載入
即將 JSX 代碼單獨(dú)放在一個(gè).jsx 文件中赚抡。

ReactDOM.render(
     <h1>hello jianshu.com</h1>,
     document.getElementById('example')
);

然后在頁(yè)面上通過下面的方式引入這個(gè) .jsx 文件。

<script type="text/babel" src="hello.jsx"></script>

3纠屋,標(biāo)簽的使用

我們除了可以在 JavaScript 中書寫 HTML 標(biāo)簽外(不需要像以前那樣做為字符串用引號(hào)引起來)涂臣。
還可以使用那些由 ReactJS 創(chuàng)建的組件類標(biāo)簽。

var Hello = React.createClass({
    render: function() {
        return <div>歡迎</div>;
    }
});
ReactDOM.render(
     <Hello />,
     document.getElementById('example')
);

比如上面的代碼中售担,我們創(chuàng)建了一個(gè)叫 Hello 的組件赁遗,此時(shí)我們就可以像使用 HTML 標(biāo)簽一樣,通過 <Hello/> 的方式把它引入進(jìn)來族铆。
注意:ReactJS 中約定自定義的組件標(biāo)簽首字母一定要大寫岩四,這樣便于區(qū)分是組件標(biāo)簽還是 HTML 標(biāo)簽。

4. 代碼轉(zhuǎn)換

使用 JSX 的書寫是為了讓我們能更直觀地看到組件的 DOM結(jié)果哥攘,其最終還是通過解析器轉(zhuǎn)化為 JavaScript 代碼才能在瀏覽器端執(zhí)行炫乓。
比如我們寫了如下一段代碼:

var msg = <h1 width="10px">hello jianshu.com</h1>;

那么解析器就會(huì)轉(zhuǎn)化為:

var msg = React.createElement("h1", {width: "10px"}, "hello jianshu.com");

也就是說我們每寫一個(gè)標(biāo)簽,就相當(dāng)于調(diào)用一次 React.createElement方法并最后返回一個(gè) ReactElement 對(duì)象給我們献丑。
當(dāng)然我們不使用 JSX末捣,而是直接通過 React.createElement 方法來創(chuàng)建 ReactElement 對(duì)象也是可以的。React.createElement 方法中各個(gè)參數(shù)的含義如下:

  • 第一個(gè)參數(shù):可以是一個(gè)字符串创橄,表示一個(gè)標(biāo)準(zhǔn)的 HTML 元素箩做。或者是一個(gè) ReactClass 類型的對(duì)象妥畏,表示我們之前封裝好的自定義組件邦邦。
  • 第二個(gè)參數(shù):是一個(gè)對(duì)象(字典)。它保存了這個(gè)元素的所有固有屬性(即傳入后基本不會(huì)改變的值)醉蚁。
  • 從第三個(gè)參數(shù)開始:都被認(rèn)作是該元素的子元素燃辖。

5,執(zhí)行JavaScript表達(dá)式

JSX 中運(yùn)行 JavaScript 表達(dá)式网棍,需要將表達(dá)式用 {} 括起來黔龟。
比如下面我們先定義一個(gè)變量,再在 JSX 中調(diào)用該變量:

var str = "歡迎訪問jianshu.com";
var msg = <h1>{str}</h1>;

6滥玷,注釋

JSX 中氏身,注釋的使用和 JavaScript 是一樣的,也分為單行注釋和多行注釋惑畴。

var str = "歡迎訪問jianshu.com";
//<h1>{str}</h1>
/**
  <h1>{str}</h1>
**/

7蛋欣,支持ES6功能

JSX 中,我們完全可以使用 ES6 的語(yǔ)法如贷。因?yàn)閺?qiáng)大的解析器會(huì)自動(dòng)對(duì)不支持 ES6 語(yǔ)法的瀏覽器做降級(jí)處理陷虎。比如下面樣例到踏,我們使用了 ES6 中的一個(gè)新語(yǔ)法“...”,其作用是遍歷對(duì)象的尚猿。

var props = {};
props.key1 = "1";
props.key2 = "2";
<h1 {...props} key1="3">jianshu.com</h1>

上面執(zhí)行后夭禽,h1 元素會(huì)有兩屬性:key1="3"、key2="2"谊路。(key1 本來是 1,但被后面定義的屬性給覆蓋變成 3)

8菩彬,自定義屬性

除了標(biāo)簽特有的屬性外缠劝,我們也可以自定義一些屬性。但這些自定義屬性在真正的頁(yè)面渲染后骗灶,是否會(huì)顯示在頁(yè)面上由如下規(guī)則決定:

  • 凡是以 data- 開頭的自定義屬性惨恭,在頁(yè)面渲染后均可以顯示在頁(yè)面上。
  • data- 開頭的自定義屬性耙旦,頁(yè)面渲染后則不顯示脱羡。
    比如我們使用 JSX 書寫如下代碼:
var msg = <h1 height="50" data-test1="test1" test2="test2">jianshu</h1>

最后渲染在頁(yè)面上的結(jié)果如下∶舛迹可以看到只有以 data- 開頭的自定義屬性被渲染到頁(yè)面上锉罐,其他自定義屬性則被忽略掉。

9绕娘,顯示HTML字符串

有時(shí)候我們需要顯示一段 HTML 字符串脓规,而不是 HTML 節(jié)點(diǎn)∠樟欤可以這么寫侨舆。

<div>{'<h1>這個(gè)是html字符串</h1>'}</div>

10,樣式的使用

(1)JSX 中的樣式是通過 style 屬性定義的绢陌。和傳統(tǒng) Web 定義不同的是挨下,它不再是一個(gè)字符串而是一個(gè) JavaScript 對(duì)象。
比如下面樣例脐湾,第一個(gè)大括號(hào)表示是 JSX 語(yǔ)法臭笆,第二個(gè)大括號(hào)是 JavaScript 對(duì)象。

<div style={{color:'#ff00ff', fontSize: '20px'}}>歡迎訪問jianshu.com</div>

(2)對(duì)于屬性名要轉(zhuǎn)為駝峰命名格式秤掌,如果不想轉(zhuǎn)的話耗啦,則需要加引號(hào)括起來。比如:'font-size':'20px'
(3)也可以通過 className='xxx' 的方式引入樣式机杜。(切記是 className 而不是 class

11帜讲,事件綁定

代碼如下。JSX 支持所有的 HTML 元素的事件椒拗。但要注意的是似将,事件名稱一定要用駝峰命名方式获黔,如果將 onClick 改成 onclick 就不起作用了。

div id="example"></div>
 
<script type="text/babel">
  function testClick() {
    alert("點(diǎn)擊了按鈕!");
  }
  var app = <button onClick={testClick.bind(this)} style={{fontSize: '28px'}}>
              按鈕
            </button>
  ReactDOM.render(
       app,
       document.getElementById('example')
  );
</script>

(2)bind 方法第一個(gè)參數(shù)是用來設(shè)置作用域的在验。如果要給綁定的事件傳遞參數(shù)玷氏,可以從 bind 方法第二個(gè)參數(shù)起放置我們需要傳遞的參數(shù)。

function testClick(value) {
  alert(value);
}
var app = <button onClick={testClick.bind(this,'我是參數(shù)')} style={{fontSize: '28px'}}>
            按鈕
          </button>
 
ReactDOM.render(
     app,
     document.getElementById('example')
);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腋舌,一起剝皮案震驚了整個(gè)濱河市盏触,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌块饺,老刑警劉巖赞辩,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異授艰,居然都是意外死亡辨嗽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門淮腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糟需,“玉大人,你說我怎么就攤上這事谷朝≈扪海” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵圆凰,是天一觀的道長(zhǎng)诅诱。 經(jīng)常有香客問我,道長(zhǎng)送朱,這世上最難降的妖魔是什么娘荡? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮驶沼,結(jié)果婚禮上炮沐,老公的妹妹穿的比我還像新娘。我一直安慰自己回怜,他們只是感情好大年,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玉雾,像睡著了一般翔试。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上复旬,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天垦缅,我揣著相機(jī)與錄音,去河邊找鬼驹碍。 笑死壁涎,一個(gè)胖子當(dāng)著我的面吹牛凡恍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怔球,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚼酝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了竟坛?” 一聲冷哼從身側(cè)響起闽巩,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担汤,沒想到半個(gè)月后涎跨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漫试,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碘赖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驾荣。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖普泡,靈堂內(nèi)的尸體忽然破棺而出播掷,到底是詐尸還是另有隱情,我是刑警寧澤撼班,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布歧匈,位于F島的核電站,受9級(jí)特大地震影響砰嘁,放射性物質(zhì)發(fā)生泄漏件炉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一矮湘、第九天 我趴在偏房一處隱蔽的房頂上張望斟冕。 院中可真熱鬧,春花似錦缅阳、人聲如沸磕蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秀撇。三九已至,卻和暖如春向族,著一層夾襖步出監(jiān)牢的瞬間呵燕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工件相, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虏等,地道東北人弄唧。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像霍衫,于是被迫代替她去往敵國(guó)和親候引。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時(shí)敦跌,對(duì)React的特性澄干、重點(diǎn)和注意事項(xiàng)的提取、精練和總結(jié)柠傍,可以做為React特性...
    科研者閱讀 8,232評(píng)論 2 21
  • JSX 知識(shí)準(zhǔn)備 JSX 并不是一門全新的語(yǔ)言麸俘,僅僅是一個(gè)語(yǔ)法糖,允許開發(fā)者在javascript中編寫XML語(yǔ)言...
    艾倫先生閱讀 4,504評(píng)論 4 20
  • 原文地址:Learning React.js is easier than you think原文作者:Samer...
    sunshine小小倩閱讀 4,223評(píng)論 3 41
  • 本筆記基于React官方文檔惧笛,當(dāng)前React版本號(hào)為15.4.0从媚。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,700評(píng)論 14 128
  • 上證指數(shù)6連陽(yáng),以趨勢(shì)股引領(lǐng)而起的牛市行情仍未落幕患整。 周一拜效,銀行接替了保險(xiǎn),為題材搭建了平臺(tái)各谚;5G紧憾、芯片板塊內(nèi)部輪...
    Leo凱文閱讀 179評(píng)論 0 1