了解一下 WebComponent 自定義元素
基本上無害
發(fā)布于 云南 2025-01-26 · 6712瀏覽

自定義元素(custom element):即由 Web 開發(fā)人員定義行為的 HTML 元素,擴(kuò)展了瀏覽器中可用的元素集。

分類

分為兩種:

自定義內(nèi)置元素

繼承至原有的 HTML 元素,例如 HTMLImageElement 或 HTMLParagraphElement。

使用原有元素并加上 is 屬性來使用,例:

<p is="custom-paragraph-element"></p>

獨(dú)立自定義元素

繼承 HTML 元素基類 HTMLElement

然后像已有的內(nèi)置元素一樣使用:

<custom-element></custom-element>

如何使用?

1. 編寫:實(shí)現(xiàn)自定義組件類,并繼承 HTMLElement 或其他基類

2. 注冊(cè):使用 customElements.define() 將自定義組件注冊(cè)到登記表

編寫

構(gòu)造函數(shù)

class customElement extends HTMLElement { contructor() { super(); // super() 的返回值是對(duì)當(dāng)前元素的引用 // self = super(); } }

有一些注意事項(xiàng):

  • 無參數(shù)的 super() 必須是構(gòu)造函數(shù)中第一個(gè)語(yǔ)句。

  • 構(gòu)造函數(shù)內(nèi)部的 return 語(yǔ)句必須非常小心使用,除非它是一個(gè)簡(jiǎn)單的提前返回(例如 return 或 return this)。否則,不能在構(gòu)造函數(shù)中出現(xiàn) return 語(yǔ)句。

  • 通常應(yīng)盡可能將工作推遲到 connectedCallback 中,特別是涉及獲取資源或渲染的工作。

    然而,請(qǐng)注意,connectedCallback 可能會(huì)被調(diào)用多次,因此,任何真正只需要執(zhí)行一次的初始化工作都需要有一個(gè)防護(hù)機(jī)制,以防止它被執(zhí)行多次。

  • 一般而言,構(gòu)造函數(shù)應(yīng)該用于設(shè)置初始狀態(tài)和默認(rèn)值,并設(shè)置事件監(jiān)聽器以及可能的陰影根(shadow root)。

生命周期回調(diào)

  • connectedCallback:當(dāng)自定義元素第一次被連接到文檔 DOM 時(shí)被調(diào)用。

  • disconnectedCallback:當(dāng)自定義元素與文檔 DOM 斷開連接時(shí)被調(diào)用。

  • adoptedCallback:當(dāng)自定義元素被移動(dòng)到新文檔時(shí)被調(diào)用。

  • attributeChangedCallback:當(dāng)自定義元素的一個(gè)屬性被增加、移除或更改時(shí)被調(diào)用。

響應(yīng)屬性變化

類中可以定義一個(gè)名為 observedAttributes 的靜態(tài)屬性,里面存放需要變更通知的屬性名。

然后使用生命周期中的 attributeChangedCallback 來監(jiān)聽屬性變化,該回調(diào)接受三個(gè)參數(shù):

  • 發(fā)生變化的屬性名(需在 observedAttributes 中定義)
  • 舊的值
  • 新的值

要注意:屬性被首次解析時(shí)也會(huì)觸發(fā) attributeChangedCallback!類似于 Vue 的 Watch 中的 immediate 配置。

注冊(cè)

使用 CustomElementRegistry.define() 函數(shù)。

CustomElementRegistery(自定義元素登記表)是一個(gè)接口,可以注冊(cè)、獲取、更新自定義組件。要獲取它的實(shí)例可以使用 window.customElements。

define 的三個(gè)參數(shù)分別是:

  • name (required): 組件名稱

  • constructor (required): 自定義元素構(gòu)造器

  • options:控制元素如何定義,目前只有一項(xiàng):

    • extends:指定繼承哪個(gè)已有元素。當(dāng)自定義內(nèi)置元素時(shí)必填,否則會(huì)報(bào)錯(cuò)。

refer

MDN - 使用自定義元素

MDN - HTMLElement

github - Web Components 案例

MDN - CustomElementRegistry

MDN - CustomElementRegistry.define()

HTML 標(biāo)準(zhǔn):custom-elements

web.dev - 自定義元素最佳實(shí)踐

基本上無害
火星宛如雪花,從42號(hào)有軌電車車頂?shù)墓渭娖魃巷w落而下。
瀏覽 6712
相關(guān)推薦
最新評(píng)論
贊過的人
評(píng)論加載中...

暫無評(píng)論,快來評(píng)論吧!