tag不存在或已被下架!
昨天我們學會用 DOM 操控網頁、驗證表單,體驗到「用程式和使用者對話」的感覺~
今天,我們要往「更專業的前端開發」邁進,--元件化思維(Component Thinking)--,以及開發中很常用的技巧:--事件委派(Event Delegation)--。
一個電商網站,通常會有幾個商品卡片,內容大同小異:圖片、標題、價格、購物車按鈕......
如果用昨天的方法,一張一張卡片手動寫 DOM、再一個一個綁定事件,程式碼會變得:
元件化的概念,就是把「重複的東西」抽成一個「模組」
EX:
HTML<div id="productList"></div>
JS
// 資料
const products = [
{ name: '無線滑鼠', price: 450 },
{ name: '機械鍵盤', price: 2200 },
{ name: '藍牙耳機', price: 1800 }
];
// 建立一張卡片
function createProductCard(product) {
const card = document.createElement('div');
card.classList.add('product-card');
card.innerHTML = `
<h3>${product.name}</h3>
<p>$${product.price}</p>
<button class="add-to-cart">加入購物車</button>
`;
return card;
}
// 渲染到網頁
const list = document.getElementById('productList');
products.forEach(p => list.appendChild(createProductCard(p)));
這樣,未來只要新增商品資料,就能自動生成卡片,不用重複寫 DOM~
如果每個「加入購物車」按鈕都個別綁 addEventListener,當產品數量變多、或動態新增時,就麻煩了
事件委派的作法:
list.addEventListener('click', (e) => {
if (e.target.classList.contains('add-to-cart')) {
const productName = e.target.parentElement.querySelector('h3').textContent;
alert(`${productName} 已加入購物車!`);
}
});
好處:
這樣做會更容易理解前端框架(React、Vue):
專業的前端很像「組積木」:
寫的時候卡在事件委派的 target,一直抓不到正確的元素,debug 了半天才發現是 class 名字拼錯,還不止一次發生,真是會笑死。
但這也讓我體會到,前端不只是要會寫語法,還要有組織、規劃思維,才能更好的運用、打造好一個網頁。