JSX小敘

一、JSX語法干了啥?

???首先同個一個例子引入JSX語法。對于一段html代碼如:

<div class="red">
      <button class="btn btn-info"></button>
</div>

在javascript中怎么描述上述的代碼呢?

{
  type:'div',
  props:{
            className:'red',
            children:{
                          type:'button',
                          props:{
                                      className:['btn','btn-info']
                                    }
                          }
            }
}

描述一段html代碼,在javascript中需要使用這么繁雜的結(jié)構(gòu)。這種代碼不利于優(yōu)化,而且不利于維護(hù)。我們希望在javascript中也能夠書html代碼。因此,JSX語法由此而生。
JSX中代碼的實現(xiàn):

const MessageBtn = () =>(
            <div className="red">
                  <button className="btn btn-info"></button>
            </div>
        )

上述代碼是不是更加容易維護(hù),實際上JSX在編譯完成后,同樣將html代碼解析成了javascript版本的代碼。只不過這份工作有能夠解析 JSX的解析器幫助我們完成了。上述代碼解析之后的源碼為:

var MessageBtn=function(){
      return React.createElement(
          'div',
          {className:'red'},
          React.createElement(
          'button',
           {className:'btn btn-info'},
            null
          )
      )
 }

由以上代碼可以看出,你同樣能夠用React.createElement來創(chuàng)建元素,而不用JSX語法。

二、JSX語法簡介

? ?1、JSX采用的類似XML語法的ECMAScript拓展,因此,標(biāo)簽可以任意嵌套,注意:定義標(biāo)簽時,只允許被一個標(biāo)簽包裹,標(biāo)簽一定要閉合,在使用JSX編寫時候,這兩種錯誤都會及時提示出來。對于第一種錯誤的原理請想一想轉(zhuǎn)換之后的源碼揣摩下。
? ?2、元素類型:JSX規(guī)定,以大寫字母開頭的單詞會被解析成組件,小寫的解析為dom元素
注釋: 在html中的注釋注釋,由于JSX實際上也是javascript,因此,JSX中使用{/* */}來進(jìn)行注釋,請千萬注意一定要用{}擴(kuò)起來,對于判斷IE版本的條件注釋,請使用javascript腳本判斷來替代。
? ?2、元素屬性:由于html中的class和for都是javascript中的關(guān)鍵字,因此JSX進(jìn)行了轉(zhuǎn)換,使用className替代class,受用htmlFor替代for
? ?3、布爾屬性:JSX中默認(rèn)的布爾類型的值都是true,例如<checkbox checked> 表示該 選框被選中,如果不想選中,可以這樣<checkbox checked={false}>或者不寫checked屬性
? ?4、自定義html屬性:JSX不支持自定義屬性,React也不會渲染自定義屬性,例如<div d="ssss"></div>渲染的結(jié)果為<div></div>
當(dāng)你需要使用自定義屬性的時候,應(yīng)該使用html中的自定義屬性規(guī)范,即使用data-前綴。
? ?5、JSX中使用javascript表達(dá)式:JSX中使用javascript表達(dá)式用{}替代“”即可,例如:

const person =<Person name={isLisi ? 'lisi' : 'zhangsan'} />;

? ?6、html轉(zhuǎn)義:為了防止XSS攻擊,React會將字符實體進(jìn)行轉(zhuǎn)義。您可以使用以下幾種方式進(jìn)行解決。
? ? ? ?a、直接使用utf-8的字符
? ? ? ?b、使用對應(yīng)Unicode編碼
? ? ? ?c、用數(shù)組包裝下<div>{['cc','<span>&copy</span>','2015xxx']}</div>
? ? ? ?d、直接使用原生的HTML
? ? ? ?e、React提供了dangerouslySetInnderhtml 方法來避免轉(zhuǎn)義。(不到萬不得已不要使用)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 以下內(nèi)容是我在學(xué)習(xí)和研究React時,對React的特性、重點和注意事項的提取、精練和總結(jié),可以做為React特性...
    科研者閱讀 8,398評論 2 21
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評論 25 709
  • GUIDS 第一章 為什么使用React? React 一個提供了用戶接口的JavaScript庫。 誕生于Fac...
    jplyue閱讀 3,700評論 1 11
  • JSX是React的核心組成部分,它使用XML標(biāo)記的方式去直接聲明界面,界面組件之間可以互相嵌套。可以理解為在JS...
    可樂愛上咖啡閱讀 72,322評論 1 63
  • #--*-- encoding:utf-8 --*-- import os,re,shutil for s in ...
    liu_bo閱讀 197評論 0 0

友情鏈接更多精彩內(nèi)容