搜尋
首頁web前端js教程Web 元件:簡介

Web 元件:簡介

Jan 03, 2025 am 04:40 AM

在現代 Web 開發中,框架風靡一時。幾乎所有現代框架都有組件的概念。 元件背後的想法是將前端邏輯分解為更小的可重複使用區塊,您可以跨頁面或專案共享這些區塊。 一般來說,這些元件不能在其他框架中重複使用,並且需要一個建置過程來將它們編譯為可以在瀏覽器中執行的 JavaScript。

如果我告訴你有一種方法可以使用普通 JavaScript 和廣泛可用的瀏覽器 API 來建立元件,並且可以跨框架共享,你會怎麼想? 現在,這已成為 Web 元件的現實。在這裡,我們將快速瀏覽不同類型的 Web 元件,以及我們可以使用它們的一些功能。

Web 元件的基礎知識

Web 元件是使用自訂元素登錄定義的。這是大多數現代瀏覽器提供的 API。要建立 Web 元件,您只需在程式碼中定義它,然後將其註冊到自訂元素註冊表中。使用正確的命名約定註冊和定義後,該元件就可以在頁面中使用。

customElements.define("my-component", MyComponentClass);

Web 元件的類型

Web 元件可以分為兩個不同的類別。它們是自主 Web 元件自訂內建元素

自治 Web 元件 是通用 HTMLElement 類別的擴充。這些元件通常更加靈活,因為您實際上正在建立自己的 HTML 元素,並且能夠從頭開始自訂所有行為。這包括用於渲染組件的根元素。 定義後,您可以像使用任何其他 HTML 元素一樣使用自治 Web 元件。

<my-button>



<p><strong>Custom Built-In Elements</strong> extend specific HTML elements.  For example, you may extend the HTMLButtonElement class or the HTMLAnchorElement.  These are meant to augment the functionality of existing HTML elements. To use a Custom Built-In element, you use the "is" attribute on the HTML element you are augmenting to tell it that it is an instance of the Web Component.<br>
</p>

<pre class="brush:php;toolbar:false"><button is="my-button">



<h3>
  
  
  Naming Web Components
</h3>

<p>When defining a Web Component, there are certain conventions that must be followed.  </p>

<p>Generally you will name your components similar to HTML elements with your own prefix attached to keep things simple (i.e. <my-button>).  The basic rules require that the element name start with a lowercase letter, and it must include a hyphen.  These guidelines will get you by for most cases, but I would recommend looking at the HTML spec if you're curious about all rules.<br>
</my-button></p>

<pre class="brush:php;toolbar:false"><!--Valid-->
<my-button></my-button>
<your-button></your-button>

<!--Invalid-->
<my-button></my-button>

<mybutton></mybutton>

生命週期掛鉤

Web 元件具有特定的生命週期掛鉤,用於對元件經歷的不同階段做出反應。 鉤子如下:

  • connectedCallback ->當元件附加到 DOM 時運行。
  • disconnectedCallback ->當元件與 DOM 分離時運作。
  • 採用回呼 ->每次元件附加到新 DOM 時執行。
  • attributeChangedCallback ->當「observedAttributes」清單中的屬性更新時執行。
class MyComponent extends HTMLElement {
    static observedAttributes = ["btntype"]
    connectedCallback() {
        // Handle when the component is attached to the DOM
    }
    disconnectedCallback() {
        // Handle when the component is removed from the DOM
    }
    adoptedCallback() {
        // Handle when the component is attached to a new DOM
    }
    attributeChangedCallback(name, oldValue, newValue) {
        // Trigged when the "btntype" attribute is changed since it is in the list of observedAttributes.
        // "name" will be the name of the attribute that changed.
        // "oldValue" is the value before the change.
        // "newValue" is the new value after the change.
    }
}

這些生命週期鉤子用於執行建立/銷毀元件實例時所需的任何初始化或清理工作。 attributeChangedCallback 特別有用,因為它允許對屬性值更新做出反應。 Web 元件有一個特殊的靜態屬性,稱為“observedAttributes”,它是一個屬性名稱(字串)數組,將觸發 attributeChangedCallback。

無障礙

可訪問性是當今任何 Web 開發中的重要考慮因素。當涉及到 Web 元件時,您可以像在常規 HTML 或框架中一樣使用 A​​RIA 屬性,但一般來說,您將繼承所使用的 HTML 元素的內建角色和輔助功能。

所有相同的準則都適用於這裡和其他地方。例如,確保在建立元件時使用語義 HTML,添加可能需要的任何必要的鍵盤處理,並確保正確管理焦點和顏色對比度等內容。

影子 DOM

Shadow DOM 可能是 Web 元件中最令人困惑和爭議的部分。 Shadow DOM 本質上是 DOM 的一個單獨作用域的部分,位於 Web 元件

Shadow DOM 主要是自治 Web 元件所關心的問題,因為自訂內建元素只是添加到現有的 HTML 元素中。 對於自治 Web 元件,表示元素的自訂標籤(即 )被視為「主機」元素。宿主元素內是「影子根」。陰影根內是渲染元件標記的位置。

這是一個範例,您將看到「my-button」元素作為宿主,其中包含 Shadow DOM。

Web Components: An Introduction

建置 Web 元件時,可以將 Shadow DOM 設定為兩種模式。這些模式是“開放”和“封閉”。開放的 Shadow DOM 可以在 Light DOM 的 Shadow Root 之外使用 JavaScript 訪問,而封閉的 Shadow DOM 則不能。

customElements.define("my-component", MyComponentClass);

您在 Shadow DOM 中定義的任何樣式都在 Shadow DOM 範圍內,並且不會污染文件的其餘部分。 「Light DOM」(文件的其餘部分)中定義的任何樣式都不會穿透 Shadow DOM(CSS 變數是例外,但我們不會在這裡討論)。 現代瀏覽器確實提供了使用 CSS 使用零件直接從 Light DOM 定位 Shadow DOM 的方法。 您可以透過在標記中新增零件屬性來將零件新增至元件的 Shadow DOM。 然後可以使用 ::part 偽選擇器在 CSS 中定位這些部分。 這非常方便,但本質上它非常有限。 您不能將子選擇器與 ::part 選擇器連結。您只能定位 Shadow DOM 中具有「part」屬性的特定元素。

使用 Shadow DOM 時,可訪問性也是一個重要的考慮因素。如果您曾經使用過 ARIA 屬性,那麼您就會熟悉“aria-scribedby”和“aria-labelledby”,它們通常會被賦予一個 ID,該 ID 引用另一個包含螢幕閱讀器內容標籤或描述的元素。 Shadow DOM 與樣式類似,將 ID 的作用域分開,因此您無法從 Light DOM 引用位於 Shadow DOM 內的 ID,反之亦然。 當嘗試提供需要動態提供的詳細描述時,這可能會帶來挑戰,但存在解決方法,我們不會在本介紹中深入探討。

模板和插槽

模板和插槽是可以與 Shadow DOM 結合使用來增強 Web 元件的工具。模板用於在 Web 元件中建立可重複使用的片段,而插槽用於暴露可以傳遞來自 Light DOM 的內容的「洞」。

如果您需要在 Web 元件中重複渲染一段 HTML 片段,那麼模板會很方便。它們也可以在 Web 元件之外使用,但用例更有限。它們是使用“模板”標籤實現的。

槽用於將內容從 Light DOM 傳遞到 Web 元件,並使用「槽」標籤實作。如果您有一個可能需要傳入動態內容的通用元件,這會很方便。一個很好的例子可能是通用卡組件,您可以在其中公開一個插槽以將標記傳遞到卡的主體。 插槽具有“名稱”屬性,您可以提供該屬性來唯一標識插槽。如果您需要將多個插槽放入 Web 元件中,這會很方便。傳遞內容時,您只需傳遞一個值為 slot="your-slot-name" 的屬性,內容就會傳遞到具有符合名稱的插槽。

插槽和 Shadow DOM 有一個值得注意的獨特互動。 插槽可以具有在沒有任何內容傳入的情況下呈現的預設內容。傳遞到插槽的內容位於 Light DOM 中,並被「淺複製」到 Shadow DOM 中。 您可以在瀏覽器檢查器中直觀地看到這一點。槽內容將在 Web 元件內呈現,但在 DOM 中,技術上內容位於 Web 元件外部並提供槽的連結。

Web Components: An Introduction

話雖如此,這意味著所有插槽內容的樣式和引用就像 Light DOM 中的任何其他內容一樣。 Light DOM 中的樣式會影響槽內容,而 Shadow DOM 樣式則不會。 有一些 API 可用於與 Web 元件中的槽內容進行互動。

Web 元件支援

現代瀏覽器對 Web 元件的支援相當好。主要的例外是 Safari,它不支援自訂內建元素。 如果您需要支援 Internet Explorer 11 等舊版瀏覽器,則必須填入一些內容。

基本範例

現在我們已經簡要介紹了所有基本概念,讓我們來看一些範例。

自主自訂元素

這是一個名為「my-button」的自主自訂元素範例:

customElements.define("my-component", MyComponentClass);

首先要注意的是程式碼大部分是相同的。最大的區別是我們直接擴展了 HTMLButtonElement,然後我們在定義自訂元素的時候也聲明了我們擴展了按鈕。

我們也花更少的時間編寫渲染元素的程式碼。由於我們正在擴展 HTMLButtonElement,因此該元件只是一個具有額外功能的 HTML 按鈕。 我們將使用 HTML“is”屬性告訴 HTML 按鈕它是“my-button”。

這是現場範例:

您會再次注意到我們使用「is」屬性來增強現有的 HTML 按鈕元素。 您還會注意到,就像使用自治自訂元素一樣,我們可以附加事件偵聽器並使用按鈕,就像處理任何其他HTML 元素一樣,無論如何,這裡更有意義,因為它實際上只是一個擴充的HTML 按鈕。

總結

Web 元件是解決建立可在不同頁面和項目之間重複使用的可共用元件問題的普通方法。它們的工作方式更像普通的 HTML 元素,這可能會造成一些混亂,但最終它們非常有用,有助於解決現代框架所針對的許多相同問題。

在這裡,我們對 Web 元件、圍繞它們的不同概念進行了非常介紹性的研究,並透過一些快速範例展示了它們的基本功能。 從這裡開始,我們可以開始更深入地研究如何使建造和使用它們變得更容易,並研究如何處理它們的一些痛點。

如果您有興趣,請隨時查看 GitHub 中的範例,也可以在 Code Pen 中使用它們。

  • 自治自訂元素範例
  • 自訂內建元素範例
  • 額外的基本範本範例!

在下一篇文章中,我們將了解如何擴展使用模板和槽,以及如何使渲染變得更容易。 請繼續關注!

以上是Web 元件:簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript數據類型:瀏覽器和nodejs之間是否有區別?JavaScript數據類型:瀏覽器和nodejs之間是否有區別?May 14, 2025 am 12:15 AM

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScript評論:使用//和 / * * / * / * /JavaScript評論:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用