以下是一个简单的 Web Component 的示例,展示了如何创建自定义元素,并且支持属性、样式和事件处理。
我们将创建一个名为 <my-counter> 的组件,该组件包含一个计数器,用户可以点击按钮增加或减少计数。
步骤1:创建 HTML 文件
首先,我们创建一个 HTML 文件,并在其中定义我们的自定义组件。
html
复制代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Web Component Demo</title>
</head>
<body>
<!-- 使用自定义元素 -->
<my-counter></my-counter>
<script>
// Web Component定义
class MyCounter extends HTMLElement {
constructor() {
super(); // 必须首先调用 super() 以便使用 'this'
// 创建一个 Shadow DOM
this.attachShadow({ mode: 'open' });
// 初始化计数
this.count = 0;
// 组件的 HTML 模板
this.shadowRoot.innerHTML = `
<style>
/* 样式只应用于 Shadow DOM 内部 */
.counter {
display: flex;
align-items: center;
justify-content: space-around;
width: 200px;
margin: 20px;
padding: 10px;
border: 2px solid #333;
border-radius: 10px;
font-family: Arial, sans-serif;
}
button {
padding: 5px 10px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
span {
font-size: 1.5em;
font-weight: bold;
}
</style>
<div class="counter">
<button id="decrease">-</button>
<span id="count">${this.count}</span>
<button id="increase">+</button>
</div>
`;
}
connectedCallback() {
// 组件加载到 DOM 后,绑定事件
this.shadowRoot.getElementById('increase').addEventListener('click', this.increment.bind(this));
this.shadowRoot.getElementById('decrease').addEventListener('click', this.decrement.bind(this));
}
disconnectedCallback() {
// 组件从 DOM 中移除时,清理事件监听
this.shadowRoot.getElementById('increase').removeEventListener('click', this.increment);
this.shadowRoot.getElementById('decrease').removeEventListener('click', this.decrement);
}
// 增加计数
increment() {
this.count++;
this.updateCount();
}
// 减少计数
decrement() {
this.count--;
this.updateCount();
}
// 更新显示的计数值
updateCount() {
this.shadowRoot.getElementById('count').textContent = this.count;
}
}
// 定义自定义元素
customElements.define('my-counter', MyCounter);
</script>
</body>
</html>
说明:
- Shadow DOM:使用
this.attachShadow({ mode: 'open' })创建了一个 Shadow DOM,它将组件的样式和 DOM 隔离,使得外部样式不会影响内部,内部样式也不会泄露到外部页面。 - HTML 模板:通过
this.shadowRoot.innerHTML定义了组件的内部结构和样式,包括一个包含两个按钮和一个计数显示的div。 - 事件处理:在组件加载到页面时(
connectedCallback),为按钮绑定点击事件,用于增加和减少计数。disconnectedCallback负责在组件被移除时清理事件监听器。 - 计数更新:当用户点击按钮时,调用
increment和decrement方法更新计数,并通过updateCount方法更新显示的数字。
使用:
运行这个 HTML 文件后,你会看到一个简单的计数器。用户可以点击 + 和 - 按钮来增加或减少计数。
这是一个基本的 Web Component 示例,展示了如何定义一个自定义元素,并通过 JavaScript 管理状态、样式和事件。你可以根据需要进一步扩展和自定义它的功能,例如添加属性、事件回调等。