iT邦幫忙

2022 iThome 鐵人賽

0
自我挑戰組

30 天線上自學前端系列 第 44

[Day 44] [React] Map method - 定位資料到 Components

  • 分享至 

  • xImage
  •  

最近上課都是在上 components,以下是含有如何使用 Components 的 Days:

[Day 34] [React] React components 簡單介紹 (上)
[Day 35] [React] React components 簡單介紹 (下)
[Day 40] [React] React Props 簡單介紹
[Day 41] [React] React Props 練習篇!


今天要上的內容主要是介紹當重複的 props 時,可以如何使用 Map method 簡化它們。

以下是要使用的範例,這邊我們有很多重複會用到的 props:

      <Card
        name={contacts[0].name}
        img={contacts[0].imgURL}
        tel={contacts[0].phone}
        email={contacts[0].email}
      />
      <Card
        name={contacts[1].name}
        img={contacts[1].imgURL}
        tel={contacts[1].phone}
        email={contacts[1].email}
      />
      <Card
        name={contacts[2].name}
        img={contacts[2].imgURL}
        tel={contacts[2].phone}
        email={contacts[2].email}
      />

為說明方便,在與上方內容同一個檔案裡建置好一個 createCard function,把 return 內容改為 <Card/>,以及先試試看加入 name 就好,看看會發生什麼事:

function createCard(contact){
    return <Card name={contact.name}/>
}

然後上面長長一串重複的地方,就可以變成以下的樣子。HTML 目前顯示是只有 array 裡回傳的名字:

function App() {
  return (
    <div>
      <h1 className="heading">My Contacts</h1>

      {contacts.map(createCard)};

    </div>
  );
}

因為名字正確顯示了,所以可以把剩下的也加進來,目前 createCard function 的樣子:

function createCard(contact){
    return <Card 
    name={contact.name}
    img={contact.imgURL}
    tel={contact.phone}
    email={contact.email}
    />
}

至於忘記這邊的 properties name 如 name, img, tel, email,除了可以看 Card.jsx 以外,也可以用前兩天的 DevTools 來看:
https://ithelp.ithome.com.tw/upload/images/20221015/20151588DA6R482SZn.png

不過這樣設定的時候,在 console 裡面會出現一個 Warning:


Warning: Each child in a list should have a unique "key" prop.

Check the render method of `App`. See https://fb.me/react-warning-keys for more information.
    in Card (at App.jsx:6)
    in App (at src/index.js:5)

原因是因為用 Map 像這樣的迴圈功能時,需要給這些 components 一個 property name,而且一定要叫做 key

所以加上 key 之後,這個 Warning 不見了。目前 Contacts 的陣列裡,id property 是不重複的,所以可以使用 key=id

function createCard(contact){
    return <Card 
    name={contact.name}
    img={contact.imgURL}
    tel={contact.phone}
    email={contact.email}
    key={contact.id}
    
    // 加上 key 之後,Warning 就會不見了。
    
    />
}

在最後附上完整的樣子,可以用來對比一開始的範例,原本重複的地方,目前只剩下一行{contacts.map(createCard)};

import React from "react";
import Card from "./Card";
import contacts from "../contacts";

function createCard(contact){
    return <Card 
    name={contact.name}
    img={contact.imgURL}
    tel={contact.phone}
    email={contact.email}
    key={contact.id}
    />
}

function App() {
  return (
    <div>
      <h1 className="heading">My Contacts</h1>

      {contacts.map(createCard)};

      
    </div>
  );
}

export default App;

上一篇
[Day 43] [React] React DevTools 介紹 - 2
下一篇
[Day 45] [React] Map method - 練習篇! (1)
系列文
30 天線上自學前端72
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言