Web Components 通过 Custom Elements、Shadow DOM 和 HTML Template 三件套实现逻辑收敛、样式隔离与接口清晰。Custom Elements 定义语义化标签并绑定生命周期;Shadow DOM 创建独立作用域,确保样式与事件隔离;Template 与 Slot 提供结构复用与扩展能力;组件暴露明确 API、事件及属性契约,保障可集成性。

用 Custom Elements 定义语义化入口
把业务逻辑绑定到自定义标签上,比如 <order-form> 或 <payment-processor>。这不是简单包装,而是通过继承 HTMLElement 显式声明组件行为:
- 在
constructor中初始化状态和 Shadow DOM - 用
static get observedAttributes()声明哪些属性触发响应(如disabled、mode="edit") - 在
attributeChangedCallback中同步外部输入与内部状态 - 在
connectedCallback中发起必要请求(如拉取订单模板),disconnectedCallback中清理定时器或事件监听
用 Shadow DOM 锁定作用域边界
复杂逻辑常伴随表单校验、异步提交、错误提示等交互,这些必须与宿主页面完全隔离:
- 调用
this.attachShadow({ mode: 'open' })创建独立 DOM 树 - 所有样式写在 Shadow 内部(
<style>标签或 CSS 模块注入),不会被外部 CSS 覆盖,也不污染全局 - 事件默认不冒泡出 Shadow,需显式
composed: true才能穿透(例如提交成功后派发submit-success自定义事件) - 表单控件(
<input>、<select>)的值、验证状态、禁用逻辑全部在 Shadow 内闭环管理
用 HTML Template + Slot 实现结构复用与扩展性
业务组件往往需要灵活定制局部内容,比如登录页的「忘记密码」链接位置、支付页的优惠券区域:
- 用
<template>预定义结构骨架,避免字符串拼接 HTML - 用具名
<slot name="footer">开放插槽,允许父级传入 Vue/React 片段(只要宿主环境支持 slot 透传) - 结合
slotchange事件监听插槽内容变更,动态调整布局或启用对应功能 - 对非文本内容(如图标、按钮),可通过属性控制(
show-icon="true")或默认插槽统一处理
暴露明确的 API 与事件契约
独立≠封闭。一个可集成的业务组件必须提供清晰的调用方式:
- 定义公开方法:如
validate()主动触发校验、submit()启动流程、reset()清空状态 - 派发语义化事件:如
input-change(带 detail 数据)、submit-start、submit-error(含错误码和原始响应) - 支持属性绑定:所有可配置项(如
api-url、timeout、locale)都走 attribute → property 同步路径 - 避免直接操作 shadowRoot 内部节点——所有交互必须经由组件 API,否则破坏封装性


















