当前位置: 首页 > ds >正文

web组件的底层实现

一、HTML模版+影子DOM+自定义元素

  1. HTML模板(<template> 标签)

    • 作用:提供可复用的DOM片段,内容默认不渲染,通过JS动态插入。
    • 特点
      • 模板内容在页面加载时存在但不可见,避免初始渲染开销。
      • 支持动态克隆(template.content.cloneNode(true))实现复用。
    • 类比:类似“预制构件”,需要时按需组装。
  2. 影子DOM(Shadow DOM)

    • 作用:封装组件内部DOM,避免全局样式/脚本污染,实现样式和作用域隔离。
    • 关键点
      • 通过attachShadow()方法创建影子根节点(shadowRoot)。
      • 影子DOM内的样式不会泄漏到全局,外部样式也无法直接穿透(需通过::part::theme暴露接口)。
    • 类比:类似“黑盒子”,内部实现对外透明,仅通过接口交互。
  3. 自定义元素(Custom Elements)

    • 作用:通过class继承HTMLElement定义新标签,扩展浏览器原生元素能力。
    • 生命周期
      • constructor():初始化逻辑。
      • connectedCallback():组件插入DOM时触发。
      • disconnectedCallback():组件移除时触发。
      • attributeChangedCallback():监听属性变化。
    • 类比:类似“用户自定义控件”,可封装行为和样式。

二、三者结合实现web组件的示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div>123</div><!-- 组件挂载会执行自定义元素的构造函数 --><my-component><div>插槽内容</div></my-component><template id="my-template"><slot></slot><div>HTML模版内容</div></template><script>class MyComponent extends HTMLElement {constructor() {super()console.log('执行了自定义元素的构造函数')//影子DOMthis.attachShadow({ mode: 'open' })//将模版内容添加到影子DOM中this.shadowRoot.appendChild(document.getElementById('my-template').content.cloneNode(true))}}//将组件和标签名关联起来customElements.define('my-component', MyComponent)</script>
</body>
</html>

效果图:

http://www.xdnf.cn/news/5142.html

相关文章:

  • 2025数维杯数学建模B题完整限量论文:马拉松经济的高质量发展思路探索
  • PostgreSQL技术内幕30:Heap Only Tuple(HOT)原理解析
  • 理解 `.sln` 和 `.csproj`:从项目结构到构建发布的一次梳理
  • yolov5如何训练使用MRI 脊椎分割数据集_ 脊椎分割项目解决方法如何 原图,标签分别2460张 实现可视化及评估
  • 常用电阻阻值表E24(5%)和E96(1%)
  • 《软件项目经济性论证报告模板:全面解析与策略建议》
  • NWD 格式转换 STL 全流程:专业方案与迪威模型网在线转换详解
  • 《大规模电动汽车充换电设施可调能力聚合评估与预测》MATLAB实现计划
  • 【C】初阶数据结构14 -- 归并排序
  • 韩媒聚焦Lazarus攻击手段升级,CertiK联创顾荣辉详解应对之道
  • C++学习之类和对象_1
  • 日常代码逻辑实现
  • Android应用隐私合规:解决极光推送SDK提前收集WiFi信息问题
  • 解决SVN更新时,提示“不知道这样的主机“问题
  • RDD的自定义分区器-案例
  • python可视化:北方城市客流变化分析2
  • 广西某建筑用花岗岩矿自动化监测
  • 鸿蒙开发:dialog库做了一些优化
  • daytona开源代码架构分析
  • CMD常见命令
  • Oracle非归档模式遇到文件损坏怎么办?
  • 力扣:轮转数组
  • WD5030L CC/CV模式DCDC15A高效同步转换器消费电子工业控制汽车电子优选择
  • 命名视图~
  • NOIP1999提高组.拦截导弹
  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据排序操作
  • React 第三十八节 Router 中useRoutes 的使用详解及注意事项
  • OpenHarmony SystemUI开发——修改状态栏和导航栏的高度
  • Mamba 状态空间模型 笔记 llm框架 一维卷积
  • Android设备序列号获取方式全解析