React:JSX

2018-06-19 10:55 更新
JSX,全稱:JavaScript XML,一種在React組件內(nèi)部構(gòu)建標(biāo)簽的類XML語(yǔ)法。React使用JSX來(lái)替代常規(guī)的JavaScript。

JSX的特征
  • JSX是一種句法變換---每一個(gè)JSX節(jié)點(diǎn)都對(duì)應(yīng)著一個(gè)JavaScript函數(shù)
  • JSX既不提供也不需要運(yùn)行時(shí)庫(kù)
  • JSX并沒(méi)有改變或添加JavaScript的語(yǔ)義---它只是簡(jiǎn)單的函數(shù)調(diào)用而已。

雖然React并不強(qiáng)制使用JSX語(yǔ)法,但是使用JSX有不少好處
  • 運(yùn)行使用熟悉的語(yǔ)法來(lái)定義HTML元素樹(shù)。
  • JSX執(zhí)行更快,因?yàn)樗诰幾g為JavaScript代碼后進(jìn)行了優(yōu)化。
  • 它是類型安全的,在編譯過(guò)程中就能發(fā)現(xiàn)錯(cuò)誤。
  • 提供更加語(yǔ)義化且易懂的標(biāo)簽。
  • 是原生的JavaScript


JSX簡(jiǎn)單使用

ReactDOM.render(

    <h1>Hello,world!</h1>,

    document,getElementById('example')

);

注意:由于React.render方法只能解析一個(gè)標(biāo)簽,也就是只能包含一個(gè)頂層標(biāo)簽,如果要放多個(gè)標(biāo)簽,可以將多個(gè)標(biāo)簽放到一個(gè)div內(nèi);多個(gè)組件同樣是一個(gè)道理。
多個(gè)標(biāo)簽:

ReactDOM.render(

  <div>

    <h1>Hello</h1>

    <p>一起學(xué)習(xí)吧</p>

  </div>,

  document.getElementById('example')

);

多個(gè)組件:

var Hello=React.createClass({

  render:function(){

    return (

      <div className="item">Hello</div>

    );

  }

});

var World=React.createClass({

  render:function(){

    return (

      <div>world</div>

    );

  }

});

ReactDOM.render(

  <div>

    <Hello/><World/>

  </div>,

  document.getElementById('example')

);


//結(jié)果:helloworld


使用動(dòng)態(tài)值
JSX將兩個(gè)花括號(hào)之間的內(nèi)容{..}渲染為動(dòng)態(tài)值?;ɡㄌ?hào)內(nèi)指明了一個(gè)JavaScript上下文環(huán)境:在花括號(hào)中放入的任何東西都會(huì)被進(jìn)行求值。
JSX 的基本語(yǔ)法規(guī)則:遇到 HTML 標(biāo)簽(以 < 開(kāi)頭),就用 HTML 規(guī)則解析;遇到代碼塊(以 { 開(kāi)頭),就用 JavaScript 規(guī)則解析。

簡(jiǎn)單值:

var text='Hello world';

ReactDOM.render(

  <div>{text}</div>,

  document.getElementById('example')

);

//結(jié)果:Hello world

函數(shù)

function dateToString(d){

  return [

    d.getFullYear(),

    d.getMonth()+1,

    d.getDate()

  ].join('-');

};

ReactDOM.render(

  <div>{dateToString(new Date())}</div>,

  document.getElementById('example')

);


//結(jié)果:2016-9-4

數(shù)組:JSX 允許在模板中插入數(shù)組,數(shù)組會(huì)自動(dòng)展開(kāi)所有成員

var text=['hello','world'];

ReactDOM.render(

  <div>{text}</div>,

  document.getElementById('example')

);


//結(jié)果:helloworld


子節(jié)點(diǎn)
React將開(kāi)始標(biāo)簽與結(jié)束標(biāo)簽之間的所有子節(jié)點(diǎn)保存在一個(gè)名為this.props.children的特殊組件屬性中。

var Divider=React.createClass({

  render:function(){

    return (

      <div className="divider">

        <h2>{this.props.children}</h2>

      </div>

    )

  }

});


ReactDOM.render(

  <Divider>Props</Divider>,

  document.getElementById('example')

)

//渲染結(jié)果:

<div class="divider">

  <h2>Props</h2>

</div>


在上面的例子里,this.props.children == ['Props']。

JSX與HTML有何不同?

1.屬性
在HTML中,我們用內(nèi)聯(lián)的方式給每個(gè)節(jié)點(diǎn)設(shè)置屬性:

<div id="id" class="className"></div>

而在JSX中,是這樣的:

var id='id';

var className='className';

<div id={id} className={className}></div>

格式都是一致,只不過(guò)引號(hào)換成了大括號(hào)。
更為復(fù)雜的情景,還可以把屬性設(shè)置為一個(gè)函數(shù)調(diào)用返回的結(jié)果。

<div className={this.getClassName()}></div>

React每渲染一個(gè)組件時(shí),指定的變量和函數(shù)會(huì)被求值,而最終生成的DOM結(jié)果會(huì)反映出這個(gè)新的狀態(tài)。

2.條件判斷
在JSX中加入if語(yǔ)句會(huì)渲染出無(wú)效的JavaScript,但還是有方法的:

  • 使用三目運(yùn)算符
  • 設(shè)置一個(gè)變量并在屬性中引用
  • 將邏輯轉(zhuǎn)化到函數(shù)中
  • 使用&&運(yùn)算符

使用三目運(yùn)算符

render:function(){

  return (

    <div className={this.state.isActive?'active':''}></div>

  )

}


使用變量

getIsActive:function(){

  return this.state.isActive?'active':''

}


render:function(){    

  return ( 

    var isActive=this.getIsActive();  

    <div className={isActive}></div>   

  )  

}


使用函數(shù)

getIsActive:function(){

  return this.state.isActive?'active':''

}


render:function(){    

  return ( 

    <div className={this.getIsActive()}></div>   

  )  

}


使用邏輯與(&&)運(yùn)算符

在React中,null或false是不會(huì)輸出任何內(nèi)容的。

render:function(){

  return <div className={this.state.isActive && 'active'}></div>

}

如果這個(gè)布爾值為true,那么后面的值將會(huì)輸出。


非DOM屬性

  • key
  • ref
  • dangerousSetInnerHTML


鍵(key)

key是一個(gè)可選的唯一標(biāo)識(shí)符。


引用(ref)

ref運(yùn)行父組件在render方法之外保持對(duì)子組件的一個(gè)引用。

render:function(){

  return (

    <div>  <input ref='myInput'/> </div>

  )

}

當(dāng)設(shè)置了ref后,我們就可以在組件的任何地方使用 this.refs.myInput 獲取這個(gè)引用了。通過(guò)引用獲取到的這個(gè)對(duì)象被稱為 支持實(shí)例 。它并不是真的DOM,而是React在需要時(shí)用來(lái)創(chuàng)建DOM的一個(gè)描述對(duì)象。

我們可以使用 this.refs.myInput.getDOMNode() 訪問(wèn)真實(shí)的DOM節(jié)點(diǎn)。


事件


在所有瀏覽器中,事件名已經(jīng)被規(guī)范化并統(tǒng)一用駝峰形式表示,例如,click變成了onClick,change變成了onChange。

handleClick:function(event){},

render:function(){

  return <div onClick={this.handleClick}></div>

}

注意:React自動(dòng)綁定了組件所有方法的作用域,我們永遠(yuǎn)不需要去手動(dòng)綁定。


注釋

在JSX語(yǔ)法中,有兩種方式添加注釋:

  • 當(dāng)作一個(gè)元素的子節(jié)點(diǎn)
  • 內(nèi)聯(lián)在元素的屬性中

作為子節(jié)點(diǎn)
子節(jié)點(diǎn)形式的注釋只需要簡(jiǎn)單的包裹在花括號(hào)內(nèi)即可,并且可以跨行

<div>

  {/*注釋*/}

  <p></p>

</div>


作為內(nèi)聯(lián)屬性

<div>

  <p

  /*注釋*/

  ></p>

</div>


特殊屬性

由于JSX最后是轉(zhuǎn)換為原生的JavaScript的,所以有一些關(guān)鍵詞是不能使用的,例如:

用 htmlFor 代替 for 

用 className 代替 class 


樣式

React把所有的內(nèi)聯(lián)樣式都規(guī)范化為了駝峰形式,如果你使用過(guò)原生的JavaScript中的DOM的style屬性,就會(huì)發(fā)現(xiàn)兩者是一致的。

var styles={

  borderColor:'#000',

  borderRadius:'5'

}

React.createClass({

  render:function(){

    return (<div style={styles}></div>)

  }

})


React 的 JSX 里約定分別使用首字母大、小寫來(lái)區(qū)分本地組件的類和 HTML 標(biāo)簽。


如果往原生 HTML 元素里傳入 HTML 規(guī)范里不存在的屬性,React 不會(huì)顯示它們。如果需要使用自定義屬性,要加 data- 前綴。

<div data-custom-attribute="foo" />


以 aria- 開(kāi)頭的 [網(wǎng)絡(luò)無(wú)障礙] 屬性可以正常使用。

<div aria-hidden={true} />


題外話:

最近好像React的中文官網(wǎng)好像秀逗了,直接點(diǎn)擊進(jìn)去都是英文,如果需要查看中文版,可以這樣:

英文:http://reactjs.cn/react/docs/getting-started.html

中文:http://reactjs.cn/react/docs/getting-started-zh-CN.html

就是加上-zh-CN




以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)