玩轉 React【第02期】:戀上 React 模板 JSX

小橋流水嘩啦啦發表於2018-10-31

玩轉 React【第02期】:戀上 React 模板 JSX
往期回顧

前文中我們講解了利用 ReactElement 來編寫React程式,但是我們也看到這種方式編寫 React 特別的麻煩,而且層級結構特別不清晰。今天我們來看一種優雅的編寫React的程式碼的一種方式 JSX。

JSX

JSX就是把 js 和 xml 結合起來編寫程式的一種格式,簡單的說就是給我們的 JS 新增了 XML 的語法擴充套件。有了 JSX 之後,可以幫助我們在編寫模板的時候結構更加簡單清晰。 我們可以對比一下,我們們使用 ReactElement 和 JSX 編寫同一個結構時的區別,大家就會喜歡上 JSX;

利用 ReactElement 編寫的結構

let Title = React.createElement("h1",null,"頁面標題"); 
let Header = React.createElement("header",null,Title);  
let Sider = React.createElement("aside",null,"側邊欄");  
let Content = React.createElement("article",null,"頁面內容"); let Main = React.createElement("div",null,Sider,Content); 
let Footer = React.createElement("footer",null,"頁面底部");  
let Page = React.createElement(      "div",      null,
     Header,
     Main,
     Footer);
 ReactDOM.render(
     Page,
     document.getElementById("root")
 );
複製程式碼

利用 JSX 編寫的結構

ReactDOM.render(
        <div>
            <header>
                <h1>頁面標題</h1>
            </header>
            <div>
                <aside>側邊欄</aside>
                <article>頁面內容</article>
            </div>
            <footer>頁面底部</footer>
        </div>
        document.getElementById("root")
    );
複製程式碼

從上述示例中我們看到在 JSX 中我們可以直接使用我們熟悉的 HTML 標籤來書寫我們的模板,這樣的話結構層級非常清晰,也便於我們維護,當然上手也更便捷。

JSX 使用時的注意事項

在使用 JSX 中,不能巢狀多個同級標籤,一定要在外邊加一個父級 使用 JSX 時,我們需要使用 Babel 來進行編譯,所以必須引入 Babel 並且在 script 上 新增 type="text/babel" 來提示 babel 編譯我們 script 中的程式碼,如下所示:

<script type="text/babel">
    ReactDOM.render(
    <div>
            <h1>hello world</h1>
            <p>注意 type 另外 必須有一個父標籤包裹</p>
    </div>,
    document.getElementById("root")
    );
</script>
複製程式碼

使用 JSX 時,當我們要寫的是一個 HTML 標籤時,請全部小寫 使用 JSX 時,所有標籤都必須閉合單標籤 <單標籤 /> 也一樣必須閉合

插值表示式

當我們需要在 JSX 中插入一個js資料時,我們就需要使用插值表示式。 在 JSX 中,讀到{} 時,它就會認為你要插入一條js資料,這個 {} 就是插值表示式,使用示例如下:

let a = "hello";
let b = "React";
ReactDOM.render(
    <h1>{a + b}</h1>,
    document.getElementById("root")
);
複製程式碼

插值表示式在什麼時候使用

當我們需要在 JSX 中使用 JS 中的資料的時候,我們就需要使用差值表示式 當我們要在 JSX 中新增 註釋的時候,也需要使用插值表示式 {/* 在這裡寫JSX的註釋 */}

使用插值表示式時的注意事項

{}中,接收一個 JS 表示式,可以是我們的算術表示式,變數 或函式呼叫, 最終 {} 接收的是表示式 計算的結果 {}中,接收的是 函式呼叫時,該函式需要由返回值 {}中,不能寫 if else 以及 switch 這些流程控制語句,但是可以使用三目表示式 來進行判斷,示例如下:

let a = 10;
      let b = 20;
      ReactDOM.render(
           <h1>{a > b?"正確":"錯誤"}</h1>,
           document.getElementById("root")
  );
複製程式碼

{}中,不能寫 for 或者 whlie 這些迴圈語句,可以使用陣列方法代替,示例如下:

let arr = [
   "這是第一項",
   "這是第二項",
   "這是第三項"
  ]
  ReactDOM.render(
       <ul>
       {arr.map((item,index)=>{
       /* 當我們要向 JSX 中新增一組元素時,一定要設定  key 屬性,具體內容 我們會在後邊的文章中講到 */
       return <li key={index}>{item}</li>
       })}
       </ul>,
   document.getElementById("root")
  );
複製程式碼

不同型別資料在插值表示式中的資料輸出

字串、數字:原樣輸出

布林值、空、未定義:輸出空值,也不會有錯誤

物件:不能直接輸出,但是可以通過其他方式,Object.values、Object.keys 等方法去解析物件

陣列:支援直接輸出,預設情況下把陣列通過空字串進行拼接

JSX的屬性操作

屬性值加了引號,那麼就是一個普通的屬性書寫方式

ReactDOM.render(
      <h1 title="React筆記">React筆記</h1>,
      document.getElementById("root")
  );
複製程式碼

屬性值可以直接寫成差值表示式

let title = "React筆記" 
  ReactDOM.render(
      <h1 title={title}>React筆記</h1>,
      document.getElementById("root")
  );
複製程式碼

class:在 JSX 中需要使用 className 屬性去代替 class

ReactDOM.render(
      <h1 className="title">React筆記</h1>,
      document.getElementById("root")
  );
複製程式碼

style:在 JSX 中 style 的值只能是物件 style={{ property : value }}

let style = {
  borderBottom: "1px solid #000"
  }
  ReactDOM.render(
      <h1 style={style}>React筆記</h1>,
      document.getElementById("root")
  );

  ReactDOM.render(
      <h1 style={{
      borderBottom: "1px solid #000"
      }}>React筆記</h1>,
      document.getElementById("root")
  );
複製程式碼

看完了 JSX 的基本操作之後,我們來看一個小例子,如何通過資料來生成一個簡單的檢視

let data = {
        title: "巔峰榜·熱歌",
        details: [
                {
                name: "體面",
                message: "《前任3:再見前任》電影插曲"
                },
            
                {
                name: "說散就散",
                message: "《前任3:再見前任》電影主題曲"
                },
            
                {
                name: "BINGBIAN病變 (女聲版) ",
                message: "抖音熱門歌曲"
                }
        ]
 }
    ReactDOM.render(
        <section className="box">
        <h2 className="title">{data.title}</h2>
        <ul className="list">
        {data.details.map((item,index)=>{
        return (
        <li>
            <p className="name">{item.name}</p>
            <p className="message">{item.message}</p>
        </li>
        );
        })}
        </ul>
        </section>,
    document.getElementById("root")
    );
複製程式碼

關於 JSX 的基本使用我們就說到這,在下一章節中我們要說到一個比較重的內容--元件。 當然在 React 中編寫元件的方式也會有多種,我們在下一篇中詳細的說。

——以上是筆者歸納總結,如有誤之處,歡迎指出。

訂閱號ID:Miaovclass

關注妙味訂閱號:“妙味前端”,為您帶來優質前端技術乾貨;

相關文章