WebComponent初探

266 阅读2分钟

以下是一个简单的 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>

说明:

  1. Shadow DOM:使用 this.attachShadow({ mode: 'open' }) 创建了一个 Shadow DOM,它将组件的样式和 DOM 隔离,使得外部样式不会影响内部,内部样式也不会泄露到外部页面。
  2. HTML 模板:通过 this.shadowRoot.innerHTML 定义了组件的内部结构和样式,包括一个包含两个按钮和一个计数显示的 div
  3. 事件处理:在组件加载到页面时(connectedCallback),为按钮绑定点击事件,用于增加和减少计数。disconnectedCallback 负责在组件被移除时清理事件监听器。
  4. 计数更新:当用户点击按钮时,调用 incrementdecrement 方法更新计数,并通过 updateCount 方法更新显示的数字。

使用:

运行这个 HTML 文件后,你会看到一个简单的计数器。用户可以点击 +- 按钮来增加或减少计数。

这是一个基本的 Web Component 示例,展示了如何定义一个自定义元素,并通过 JavaScript 管理状态、样式和事件。你可以根据需要进一步扩展和自定义它的功能,例如添加属性、事件回调等。