【從零開始學JavaScript】實作練習 - 分類型Menu(下)
Q&A
前言
- 上次完成了清單的顯示,這次要完成的是按鈕的設置。
JavaScript重點
新增
displayMenuButtons()函式 : 在畫面顯示出類別按鈕1
2
3function displayMenuButtons(){
// Details...
};下列的程式碼都在
displayMenuButtons()之內利用
Array.reduce()去篩選出新的categores陣列,內含各式食物類別1
2
3
4
5
6const categores = menu.reduce(function(values,item){
if(!values.includes(item.category)){
values.push(item.category);
};
return values;
},['all']);Array.reduce(function(accumulator, currentValue), initialValue):accumulator(即範例中的values): 紀錄上一次呼叫後,所回傳的累加數值。(在範例中,就是紀錄著已被放入類別陣列的類別)currentValue(即範例中的item): 原陣列目前所迭代處理中的元素。(類似for迴圈中的i)initialValue(即範例中的['all']): 另外放入類別陣列的第一個元素
- 最後,
categores中會包含 :["all", "breakfast", "lunch", "shakes", "dinner"]
新增
categoryBtns字串 : 將類別陣列轉成HTML的Button程式碼1
2
3const categoryBtns = categores.map(function(category){
return `<button class="filter-btn" type= "button" data-id = "${category}">${category}</button>`;
}).join("");Array.map()的功能介紹,請見【上篇】- 將按鈕的Class設為
filter-btn - data-* 屬性 :
- 可以添加一些自己需要的屬性名稱,其中
*就是一個可以自定義的名稱,例如:data-key='83'或者是data-item='1' - 在JavaScript中,可以用
dataset物件取得其屬性值(後面會用到)
- 可以添加一些自己需要的屬性名稱,其中
將
categoryBtns設為類別按鈕DIV的內容碼1
container.innerHTML = categoryBtns;
innerHTML的功能介紹,請見【上篇】
利用
class="filter-btn"去抓取所有的類別按鈕元素1
const filterBtns = container.querySelectorAll('.filter-btn');
針對每個按鈕,新增點擊事件
1
2
3
4
5filterBtns.forEach(function(btn){ //選擇每個按鈕
btn.addEventListener('click',function(e){ //新增點擊事件
//details...
});
});下列的程式碼都在
btn.addEventListener()之內確認被點擊之按鈕的類別名稱
1
const category = e.currentTarget.dataset.id;
- dataset的用途,上方第3點有提到
篩選出在
menu陣列中該類別的所有物件,並存在menuCategory陣列中1
2
3
4
5const menuCategory = menu.filter(function(menuItems){
if (menuItems.category === category){ //判斷是否為被選取的類別
return menuItems; //回傳所需物件至menuCategory陣列中
};
});Array.filter():filter()會回傳一個陣列,其條件是回傳後方為true的物件,很適合用在搜尋符合條件的資料。
若是按”all”按鈕,則顯示所有食物;若是按了其他類別按鈕,則顯示屬於該分類的食物
1
2
3
4
5if(category === "all"){
displayMenuItems(menu);
}else{
displayMenuItems(menuCategory);
};(回到最外層)最後,設定在網頁被讀入時,自動顯示所有內容,並顯示按鈕與開啟其功能
1
2
3
4window.addEventListener('DOMContentLoaded',function(){
displayMenuItems(menu); //預設顯示所有內容
displayMenuButtons(); //顯示按鈕與開啟其功能
});
參考與引用來源
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


