Lala Code

Lala 的前端大補帖,歡迎一起鑽研前端技術😊

0%

【DAY 8】React 列表渲染,將陣列、物件渲染成元素

cover

[情境任務]

小當家:我把餐廳大致上的料理都開發出來囉!名單都整理好了,直接列上去就行

解師傅:太好了~哇!這菜色有點多呢!一個一個列好像太花時間了…不知道能不能一次把這些通通放到菜單上呢?老闆你有什麼想法嗎?

用複製組件的方法雖然不是不行,但我們想要更有效率且好維護的方法!😕


列表渲染

當資料開始多時,將每個元件都複製、塞 props,這並不是一個好維護的作法,
明明是做同一件事卻看起來很冗長

1
2
3
4
5
6
7
8
9
10
<ul>
<List name="蘆筍沙拉" price={100} />
<List name="辣炒空心菜" price={120} />
<List name="雞蛋豆腐" price={150}/>
<List name="鳳梨蝦球" price={300}/>
<List name="糖醋雞丁" price={200}/>
<List name="砂鍋魚頭" price={500}/>
<List name="竹筍炒肉絲" price={150}/>
<List name="梨山高麗菜" price={120}/>
</ul>

這結構其實都一樣,我們可以將資料模組化,再從一個集合中把資料渲染到畫面,像 Vue、Angular 會有自定義渲染列表的模版,而 React 並沒有列表模版,大多是使用 JavaScript 本身的語法 map 產生,以下列出陣列與物件的渲染方式




◆ 陣列渲染成元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function App() {
const chef = [
{ name: "小當家" },
{ name: "解師傅" },
{ name: "雷恩" }
];

return (
<ul>
{chef.map((item, index) => (
<li key={item.name}>
{index + 1}. {item.name}
</li>
))}
</ul>
);
}

export default App;

資料為一個陣列,要重複渲染的地方用大括弧 {} 包住,使用 JavaScript 的陣列語法 map 將每個 item 渲染出來,map 的第二個參數為索引值 index



除了陣列,物件也可以渲染

◆ 物件渲染成元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function App() {
const chef = {
name: "小當家",
age: 13,
height: 150
};

return (
<ul>
{Object.keys(chef).map((key) => {
const value = chef[key];
return (
<li key={value}>
{key}: {value}
</li>
);
})}
</ul>
);
}

export default App;

物件使用 Object.keys 先把物件屬性變成陣列,再使用 map 渲染

物件渲染出來的結果順序不一定相同,如果要照資料排序須將資料改為陣列





你可能會發現,不管是陣列或物件,為什麼渲染列表第一個元素都有 key 屬性?!



key 必須是唯一值

不管是陣列或物件,渲染出來的第一個元素需要帶入 key 屬性,key 是用來辨別元素的改變或增減

如陣列改變,React 會透過 key 去比較新舊元素有無變更,只改變有變更的元素,才不會整個列表再被重新渲染,影響效能

如果你忘了加 key,在 console 也會跳出錯誤,提醒你要加 key

key

◆ 不建議使用索引作為 key,尤其如果項目的順序會改變的話,這會對效能產生不好的影響,也可能會讓 component 資料產生問題,最好的方法還是加上唯一值,通常可以加上 id



[任務解題]
利用陣列渲染出 menu,渲染 component,並帶入 item 的 props,記得也要加上 key 哦!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import List from "./components/List";

function App() {
const menu = [
{ name: "蘆筍沙拉", price: 100 },
{ name: "辣炒空心菜", price: 120 },
{ name: "雞蛋豆腐", price: 150 },
{ name: "鳳梨蝦球", price: 300 },
{ name: "糖醋雞丁", price: 200 },
{ name: "砂鍋魚頭", price: 500 },
{ name: "竹筍炒肉絲", price: 150 },
{ name: "梨山高麗菜", price: 120 },
{ name: "五更腸旺", price: 250 },
{ name: "客家小炒", price: 250 },
{ name: "三杯杏鮑菇", price: 180 }
];

return (
<div className="App">
<h1>React 熱炒店</h1>
<ul>
{menu.map((item, index) => (
<List
key={item.name}
name={item.name}
price={item.price}
index={index}
></List>
))}
</ul>
</div>
);
}

export default App;

餐廳的菜單列表就這樣被渲染出來囉!!🤩

有新的菜色或需要調整時,直接更改 menu 陣列就可以了!



結語

學會渲染列表就可以做很多事了,看起來簡短很多,重要的是好維護,當需要修改資料時,不用去找 component 的 props,直接統一在資料模組管理就好了!


本文為 IT 鐵人賽系列文 你 React 了嗎? 30 天解鎖 React 技能




Hey!想學習更多前端知識嗎?

最近 Lala 開了前端課程 👉【實地掌握RWD - 12小時新手實戰班】👈
無論您是 0 基礎新手,又或是想學 RWD 的初學者,
我們將帶你從零開始,深入了解並掌握 RWD 響應式網頁設計的核心技術,快來一起看看吧 😊



🚀線上課程分享

線上課程可以加速學習的時間,省去了不少看文件的時間XD,以下是我推薦的一些課程
想學習更多關於前後端的線上課程,可以參考看看。

Hahow

Hahow 有各式各樣類型的課程,而且是無限次數觀看,對學生或上班族而言,不用擔心被時間綁住



六角學院

如果你是初學者,非常推薦六角學院哦!
剛開始轉職也是上了六角的課,非常的淺顯易懂,最重要的是,隨時還有線上的助教幫你解決問題!


Udemy

Udemy 裡的課程非常的多,品質普遍不錯,且價格都滿實惠的,CP值很高!
也是很多工程師推薦的線上課程網站。
❤️