本指南演示了构建可重用的 Web 组件:一个简单的计数器。 我们将利用自定义元素、Shadow DOM 和 HTML 模板。完成的计数器将具有用于增加和减少显示数值的按钮。
此代码的完整、可运行版本可以在此处。
先决条件:
熟悉基本的 JavaScript 和对 DOM(文档对象模型)的概念性理解会很有帮助,尽管不是严格要求。
项目设置:
创建两个文件:counter.html
(包含页面结构)和 counter.js
(包含自定义元素定义)。
counter.html
(初始结构):
<code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <title>Counter Component</title> </head> <body> <script src="counter.js"></script> </body> </html></code>
创建模板(counter.html
- 添加模板):
我们将使用 HTML 模板定义计数器的视觉结构:
<code class="language-html"><template id="x-counter"> <button id="min-btn">-</button> <span id="counter-display">0</span> <button id="plus-btn">+</button> </template></code>
该模板不会直接渲染;它充当我们自定义元素的蓝图。
定义自定义元素 (counter.js
):
这段 JavaScript 代码定义了计数器的功能:
<code class="language-javascript">class XCounter extends HTMLElement { constructor() { super(); this.counter = 0; this.elements = {}; } connectedCallback() { const template = document.getElementById("x-counter"); this.attachShadow({ mode: "open" }); this.shadowRoot.appendChild(template.content.cloneNode(true)); this.elements = { plusBtn: this.shadowRoot.querySelector("#plus-btn"), minBtn: this.shadowRoot.querySelector("#min-btn"), counterDisplay: this.shadowRoot.querySelector("#counter-display") }; this.displayCount(); this.elements.plusBtn.onclick = () => this.increment(); this.elements.minBtn.onclick = () => this.decrement(); } increment() { this.counter++; this.displayCount(); } decrement() { this.counter--; this.displayCount(); } displayCount() { this.elements.counterDisplay.textContent = this.counter; } } customElements.define("x-counter", XCounter);</code>
这个类扩展了HTMLElement
。 connectedCallback
处理元素添加到页面时的设置,包括附加影子 DOM 和事件监听器。 increment
、decrement
和 displayCount
管理计数器的值和显示。
使用计数器组件(counter.html
- 添加自定义元素):
要使用计数器,只需将 <x-counter></x-counter>
添加到您的 HTML 中即可。
设置组件样式(counter.js
- 添加样式):
使用 adoptedStyleSheets
将样式封装在组件内:
<code class="language-javascript">connectedCallback() { // ... (previous code) ... const sheet = new CSSStyleSheet(); sheet.replaceSync(this.styles()); this.shadowRoot.adoptedStyleSheets = [sheet]; // ... (rest of connectedCallback) ... } styles() { return ` :host { display: block; border: dotted 3px #333; width: fit-content; height: fit-content; padding: 15px; } button { border: solid 1px #333; padding: 10px; min-width: 35px; background: #333; color: #fff; cursor: pointer; } button:hover { background: #222; } span { display: inline-block; padding: 10px; width: 50px; text-align: center; } `; }</code>
这添加了包含在影子 DOM 中的基本样式。
结论:
本教程演示了创建一个简单的、可重用的 Web 组件。 模板、shadow DOM 和自定义元素的使用促进了 Web 开发的模块化和可维护性。请记住将 [here](https://www.php.cn/link/2eac42424d12436bdd6a5b8a88480cc3)
替换为最终代码的实际链接。
以上是如何从头开始构建简单的 Web 组件的详细内容。更多信息请关注PHP中文网其他相关文章!