為了讓後續開發更順利,開始實作前,還是得先長篇大論一下~
我在學習 Web Component 的過程中常常會陷入:這個 UI 該怎麼寫的思維陷阱。但其實,Web Component 應該是要設計一個
給別人套用的元件
。
我認為要思考: 我這個元件應該開放哪些設定?使用者要怎麼插入自定義內容?哪個邏輯要暴露呢?
接下來先一起探討一下,到底什麼是好用的 web component!
其實就技術上來說,幾乎所有的 UI 元件都可以做成 Web Component,但是這些元件真的都適合做成 Web Component 嗎?
我認為可以用幾點來判斷。
獨立性強、單純、可重用性高
Web Component 適合做獨立性強,可重用的元件,作為大型開發專案的積木。
元件就像是一個 Hub,提供了許多已經定義好的接口,而這些接口要接上 USB、鍵盤、滑鼠,還是電腦螢幕,都是由使用者決定。Web Component 就是一個「可重用的小套件」。你不應該替使用者決定它會被用在哪,而是要清楚規劃它的設定值(屬性、事件、插槽),讓使用者能自由決定內容與用途。
為了後續的可維護性及可擴充性,進入設計前都可以先思考一下:
核心功能
再考慮擴充元件命名方式注意事項:
- 元件命名方式要使用複合式命名(必須包含一個連字號
-
)- 不能用瀏覽器已經保留的名稱(像是 head, table, img ...)
- 盡量語意化,一看到標籤可以知道這個元件大致使用功能
身為一個愛貓人士,決定先取名叫 cat-spinner
。
繼承 HTMLElement
記得要呼叫 super,不然你無法觸發 JS 的繼承機制
spinner.js
class CatSpinner extends HTMLElement {
constructor() {
super();
}
}
customElements.define
來註冊一個自訂元件customElements.define(`元件名稱`, `class 名稱`);
class CatSpinner extends HTMLElement {
constructor() {
super();
this.innerHTML = `
<style>
.spinner {
width: 40px;
height: 40px;
border: 4px solid #ccc;
border-top: 4px solid #333;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<div class="spinner"></div>
`;
}
}
// 在這裡定義你的元件
customElements.define('cat-spinner', CatSpinner);
index.html
,引用剛剛建立的 spinner.js
檔案<body>
<div style="display: flex; gap: 12px; padding: 20px">
<h2>Web Component</h2>
<!-- 加入你的自訂元件 -->
<cat-spinner></cat-spinner>
</div>
<script src="spinner.js"></script>
</body>
接下來你就可以在瀏覽器中看見剛剛定義的 cat-spinner
,
就是這麼簡單,順利完成自訂元件了,恭喜你!已經學完了(誤 XD
(我需要研究一下怎麼貼 gif 檔 இдஇ)
下一篇就一起往第二個核心 Shadow DOM
深入研究吧!