# Web Components

Web Components 是一套由现代浏览器原生支持的组件化技术,允许开发者创建可重用、封装良好的自定义 HTML 元素。其核心由以下四项技术构成:

# 1. Custom Elements(自定义元素)

- 作用:通过 JavaScript 定义新的 HTML 标签,扩展浏览器的内置元素。
- 示例:

```js
    class MyButton extends HTMLElement {
    constructor() {
        super();
        this.addEventListener('click', () => alert('Clicked!'));
    }
    }
    customElements.define('my-button', MyButton);
```

```js
<my-button>点我</my-button>
```

生命周期:提供connectedCallback(挂载)、disconnectedCallback(卸载)等方法,用于管理组件的状态。

# 2. Shadow DOM(影子DOM)

作用:将组件的内部结构、样式与外部 DOM 隔离,避免 CSS 和 JavaScript 的全局污染。 示例: class MyComponent extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({ mode: 'open' }); shadow.innerHTML = <style>p { color: blue; }</style> <p>封装的内容</p>; } } 模式:mode: 'open'允许外部访问 Shadow DOM,closed则完全隔离。

# 3. HTML Templates(模板)

作用:通过 标签定义可复用的 HTML 片段,仅在需要时渲染。 示例:

const template = document.getElementById('user-card'); const clone = template.content.cloneNode(true); document.body.appendChild(clone); 4. HTML Slots(插槽) 作用:在组件内部预留可自定义内容的占位符,增强灵活性。 示例: 张三 zhangsan@example.com 优势 原生支持:无需依赖框架(如 React/Vue),但可与它们协同使用。 封装性:Shadow DOM 隔离样式和 DOM,避免冲突。 可重用性:一次定义,跨项目复用。 标准化:W3C 标准,主流浏览器均支持(需 Polyfill 兼容旧版)。 挑战 数据传递:需通过属性(Attributes)或事件(Custom Events)通信。 状态管理:缺乏框架级的响应式机制,需手动处理更新。 样式穿透:外部样式默认无法影响 Shadow DOM,可通过 ::part() 或 CSS 变量控制。 适用场景 构建跨框架的 UI 库(如 Google 的 Material Web Components)。 开发需长期维护的复杂应用,降低对特定框架的依赖。 创建高封装性组件(如视频播放器、图表库)。 通过 Web Components,开发者能以更模块化、标准化的方式构建 Web 应用,平衡灵活性与维护性。