react 也就這麼回事 02 —— JSX 插值表示式、條件渲染以及列表渲染

蜜瓜發表於2022-02-23

我們已經學會了 React 建立元素和渲染元素

ReactDOM.render(<div>Hello React!</div>, document.getElementById("root"));

Hello React會被嵌入到<div>標籤中,並且顯示在頁面上。

那麼 React 如何將變數、算術運算、函式呼叫等表示式的結果顯示在頁面上呢?

插值表示式

React 提供了在 JSX 中嵌入表示式的方式,我們可以將表示式包裹在大括號中,並將它嵌入 JSX 中

在下面的例子中,我們宣告瞭一個名為 name 的變數,然後在 JSX 中使用它

const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>;

ReactDOM.render(
  element,
  document.getElementById('root')
);

{name}這種用大括號包裹一個表示式的寫法被稱為“插值表示式”

在 JSX 語法中,你可以在大括號內放置任何有效的 JavaScript 表示式。例如,2 + 2user.firstNameformatName(user) 都是有效的 JavaScript 表示式。

你甚至可以在大括號中放置 JSX,因為 JSX 本身就是一個表示式。編譯之後,JSX 表示式會被轉換成普通的 JavaScript函式呼叫

線上程式碼

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

雖然可以在大括號中放置任何有效的 JavaScript 表示式,但是並不是所有資料型別都能顯示在頁面上

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Static Template</title>
  <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
  <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
</head>

<body>
  <div id="root"></div>
</body>
<script type="text/babel">
  let data1 = "Hello React!";
  let data2 = 1;
  let data3 = true;
  let data4 = undefined;
  let data5 = null;
  let data6 = [1, 2, 3];
  // let data7 = { name: "react" };
  let data7 = "object";
  let el = (
    <div>
      <div>{data1}</div>
      <div>{data2}</div>
      <div>{data3}</div>
      <div>{data4}</div>
      <div>{data5}</div>
      <div>{data6}</div>
      <div>{data7}</div>
    </div>
  );
  ReactDOM.render(el, document.getElementById("root"));
</script>

</html>

我們將不同資料型別的資料用大括號包裹,嘗試將它們顯示在頁面上

經過觀察可以發現:

  1. undefinednull 不會在頁面上顯示
  2. 陣列[1, 2, 3]顯示在頁面上會變成:123
  3. 物件則會報錯

那麼如何正確顯示陣列以及物件呢?此處暫且不表

條件渲染

在 React 中,你可以依據應用的不同狀態,只渲染對應狀態下的部分內容,即條件渲染

條件渲染的其中一個方式就是:在插值表示式中使用與運算子&&或者三目運算子condition ? true : false

let data = "Hello React!";
// let state = true;
let state = false;

let el = (
    <div>
        <div>{state && "state為true時顯示"}</div>
        <div>{state ? "state為true時顯示" : "state為false時顯示"}</div>
    </div>
);
ReactDOM.render(el, document.getElementById("root"));

線上程式碼

列表渲染

在大括號中直接插入陣列,並不能將陣列元素逐一顯示

let data = [1, 2, 3];
let el = (
    <div>
        {data}
    </div>
);
ReactDOM.render(el, document.getElementById("root"));
// 頁面顯示:123

如果我們想讓陣列的每個元素逐一通過<li>顯示,可以藉助函式逐一建立<li>,然後將函式插入插值表示式中

示例如下:

let data = [1, 2, 3];
const toList = (list) => {
    let ret = [];
    list.forEach((element) => {
        ret.push(<li>{element}</li>);
    });
    return ret;
};

let el = <ul>{toList(data)}</ul>;
ReactDOM.render(el, document.getElementById("root"));

在這個示例中,我們用forEach遍歷陣列,使用 JSX 建立 React 元素,將每個陣列元素都用<li>標籤包裹,得到了新的陣列[<li>1</li>, <li>2</li>, <li>3</li>]

又在<ul>{toList(data)}</ul>中通過插值表示式來將新陣列嵌入到<ul>元素中

我們已經知道了{}中的陣列顯示規則:去掉[],

於是最終得到:

let el = (
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
);

回過頭來看函式toList用已有陣列生成新陣列

我們可以用map方法和箭頭函式來進一步簡化這個方法:

const toList = (list) => list.map((element) => <li>{element}</li>);

線上程式碼

公眾號【前端嘛】

相關文章