JavaScript Web Components组件化

Web Components 由 Custom Elements、Shadow DOM 和 HTML Templates 组成,1. 通过 customElements.define 定义自定义标签;2. Shadow DOM 实现样式与结构隔离,避免冲突;3. Template 标签声明可复用结构,延迟渲染;4. 支持属性监听与生命周期回调,如 connectedCallback 与 attributeChangedCallback,实现响应式更新;组合三者可构建高内聚、可复用、跨框架的前端组件,适用于现代 Web 开发。

javascript web components组件化

Web Components 是一套让开发者创建可复用、独立封装的自定义 HTML 元素的技术,它原生支持浏览器,无需依赖框架。JavaScript Web Components 的核心由三项技术组成:Custom Elements、Shadow DOM 和 HTML Templates。结合这三项技术,可以实现真正组件化的前端开发

1. Custom Elements(自定义元素)

Custom Elements 允许你定义自己的 HTML 标签。通过 customElements.define() 方法注册一个类继承自 HTMLElement 的组件类。

例如,创建一个名为 的卡片组件:

class MyCard extends HTMLElement { constructor() { super(); this.innerHTML = `

${this.getAttribute(‘title’) || ‘默认标题’}

`; } } customElements.define(‘my-card’, MyCard);

使用时只需在 HTML 中写:这里是内容。

立即学习“Java免费学习笔记(深入)”;

2. Shadow DOM(影子 DOM)

Shadow DOM 提供了真正的样式和结构隔离。将组件内部的 DOM 与页面其他部分隔离开,避免样式冲突。

在构造函数中调用 this.attachShadow({ mode: ‘open’ }) 创建 Shadow Root,并将模板插入其中。

class MyButton extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({ mode: ‘open’ }); shadow.innerHTML = ` button { padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } button:hover { background-color: #0056b3; } `; } } customElements.define(‘my-button’, MyButton);

这样按钮的样式不会影响外部,也不会被外部 CSS 污染。

3. HTML Templates(模板标签)

使用 标签定义可复用的 HTML 结构,它不会在页面中渲染,直到被 JavaScript 实例化。

例如:

.card { border: 1px solid #ddd; padding: 16px; border-radius: 8px; }

在自定义元素中克隆并插入模板:

const template = document.getElementById(‘card-template’); const clone = template.content.cloneNode(true); this.shadowRoot.appendChild(clone);

4. 属性与生命周期回调

Web Components 支持监听属性变化,并提供生命周期钩子:

connectedCallback:元素插入 DOM 时触发 disconnectedCallback:元素从 DOM 移除时触发 attributeChangedCallback:监控属性变化 observedAttributes:指定需要监听的属性

示例:响应主题切换

static get observedAttributes() { return [‘theme’]; } attributeChangedCallback(name, oldValue, newValue) { if (name === ‘theme’) { this.shadowRoot.querySelector(‘.card’).style.backgroundColor = newValue === ‘dark’ ? ‘#333’ : ‘#fff’; } }

基本上就这些。通过组合 Custom Elements、Shadow DOM 和 Template,你可以构建出高内聚、低耦合的 Web 组件,适用于任何现代前端项目,无论是原生 JS 还是集成到 React、Vue 中。关键是封装良好、样式隔离、可复用性强。不复杂但容易忽略细节,比如 slot 使用、属性监听和 Shadow Root 的管理。

以上就是JavaScript Web Components组件化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1533056.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 00:15:13
下一篇 2025年12月21日 00:15:23

相关推荐

  • 在 React Native 中动态播放音效的专业指南

    本教程详细介绍了如何在 react native 应用中利用 `react-native-sound` 库播放动态音效。文章涵盖了库的安装、音效资源的正确管理与放置、核心的播放逻辑实现,并通过示例代码演示了如何根据用户交互播放不同的音效,同时强调了资源释放等最佳实践,确保应用性能和稳定性。 Reac…

    2025年12月21日
    000
  • JavaScript中数字转换为三位小数格式的技巧

    本教程详细阐述了如何在JavaScript中将数字精确格式化为三位小数,尤其侧重于将整数(如37)转换为特定小数形式(如”0.037″),同时确保对较大数字(如2015)也能正确转换为”2.015″。核心策略是先对数字进行缩放(除以1000),再利用`…

    2025年12月21日
    000
  • 浏览器扩展与JavaScript插件开发技术

    浏览器扩展是基于WebExtensions标准的完整应用,通过manifest.json配置、background脚本监听事件、content script操作DOM,实现如广告屏蔽等深度集成功能;JavaScript插件则是嵌入网页的轻量脚本模块,用于表单验证、轮播图等页面级增强,常见为jQuer…

    2025年12月21日
    000
  • 解决React Native应用在真机上崩溃但模拟器无报错的问题

    当react native应用在真机上运行崩溃而模拟器或调试控制台却无任何错误提示时,这通常指向一个在生产构建中更为敏感的javascript运行时错误。常见原因包括缺失的模块导入、未处理的异常或原生依赖问题。核心解决方案在于仔细检查代码中的导入声明,并利用原生日志(如android logcat)…

    2025年12月21日
    000
  • 浏览器渲染原理与性能优化

    浏览器渲染流程包括解析HTML生成DOM树、解析CSS生成CSSOM树、合并为渲染树、布局、绘制和合成。任何DOM或CSSOM变更都可能触发重排重绘,影响性能。优化策略包括减少关键渲染路径长度、避免同步重排重绘、使用CSS Transform和Opacity做动画、合理使用will-change、减…

    2025年12月21日
    000
  • 使用CSS实现无缝循环背景动画

    本文将深入探讨如何利用css的强大功能,高效且优雅地创建无缝循环的背景动画效果。我们将重点介绍`background-repeat`、`@keyframes`动画和`transform`属性的组合应用,以实现流畅的视觉循环,避免手动javascript坐标管理可能带来的复杂性和性能问题,为网页和游戏…

    2025年12月21日
    000
  • JavaScript中判断对象数组是否包含特定键值对的布尔值检查

    本文探讨了在javascript中检查对象数组是否包含具有特定键值对的对象的两种主要方法:传统的`for…of`循环迭代和现代的`array.prototype.some()`方法。我们将详细介绍这两种方法的实现、特点及其适用场景,帮助开发者根据项目需求选择最合适的解决方案,以简洁高效地…

    2025年12月21日
    000
  • 使用setInterval构建高效倒计时器:防止重复启动与实现启停功能教程

    本教程详细阐述如何在JavaScript中利用setInterval构建一个健壮的倒计时器。我们将重点解决因多次触发导致计时器重复启动的问题,并通过引入状态管理和清除机制,实现计时器的启动、暂停、恢复与重置功能。通过示例代码,读者将掌握创建稳定、可控倒计时器的核心技术,提升应用的用户体验。 理解se…

    2025年12月21日
    000
  • Firestore array-contains 查询与异步批处理操作的陷阱

    本文探讨了在使用 firestore `array-contains` 查询时可能遇到的一个常见误解,并揭示了异步函数中 `await` 关键字缺失导致批处理操作失效的深层原因。通过分析一个实际案例,我们强调了在处理异步操作,尤其是在 firestore 批处理中,正确使用 `await` 的重要性…

    2025年12月21日
    000
  • JavaScript虚拟DOM算法

    虚拟DOM通过JavaScript对象模拟真实DOM,利用Diff算法比较新旧节点差异,实现最小化更新。其核心是避免频繁操作耗性能的真实DOM,采用同层比较、类型变化重建、key优化列表等策略,将复杂度降至O(n),并通过批量更新提升渲染效率。 虚拟DOM(Virtual DOM)是JavaScri…

    2025年12月21日
    000
  • JavaScript包管理与npm生态系统

    npm是JavaScript生态的核心包管理工具,负责依赖管理、版本控制与脚本执行;通过package.json记录项目配置,结合node_modules和package-lock.json确保依赖一致性;常用命令如install、update、audit提升开发效率与安全性;Yarn、pnpm等替…

    2025年12月21日
    000
  • 前端缓存策略与JavaScript存储管理

    根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…

    2025年12月21日
    000
  • Web Workers与多线程JavaScript编程实战

    Web Workers是HTML5提供的API,可在后台线程运行脚本以避免阻塞主线程。通过创建Worker脚本、实例化Worker对象并使用postMessage通信,实现如耗时斐波那契计算等任务,确保页面流畅。 JavaScript 本身是单线程语言,主线程负责 DOM 操作、事件处理和脚本执行。…

    2025年12月21日
    000
  • 前端工程化与构建工具链配置

    前端工程化通过标准化流程提升协作效率与代码质量,核心是构建工具链、模块化管理、代码规范、自动化部署的系统整合。 前端工程化不是简单地写代码,而是把开发、构建、测试、部署等流程系统化、标准化。核心目标是提升团队协作效率、保障代码质量、优化交付体验。构建工具链作为工程化的“中枢神经”,决定了项目从源码到…

    2025年12月21日
    000
  • JavaScript中如何优雅地合并对象列表:避免嵌套数组与展开运算符实践

    本文旨在解决javascript中合并对象列表时常见的误区,即如何在不创建嵌套数组的情况下,将多个对象或对象集合扁平化地组合成一个统一的列表。我们将深入探讨javascript的展开运算符(spread syntax)作为核心解决方案,并通过实例代码演示如何生成和消费一个扁平化的对象数组,从而避免结…

    2025年12月21日
    000
  • 深入理解Sinatra中跨域请求Referer URL的截断行为与浏览器策略

    本文探讨了在sinatra应用中,当处理跨域请求时,`request.referrer`或`request.env[“http_referer”]`为何仅返回来源域(origin)而非完整url的问题。核心原因在于现代浏览器默认采用`strict-origin-when-cr…

    2025年12月21日
    000
  • Sinatra 应用中获取完整引荐来源 URL 的挑战与策略

    本文探讨了在 sinatra 应用中尝试获取完整引荐来源 url 时遇到的常见问题,即 `request.referrer` 仅返回协议和域名。核心原因在于现代浏览器默认采用更严格的引荐来源策略(如 `strict-origin-when-cross-origin`),这导致跨域请求时引荐来源 ur…

    2025年12月21日
    000
  • 在一个 JavaScript 应用中合并多个 Firebase 项目的教程

    本文档旨在指导开发者如何在单个 JavaScript 应用中同时管理多个 Firebase 项目。通过为每个 Firebase 项目配置唯一的名称,并使用该名称初始化相应的应用实例,开发者可以轻松地从不同的 Firebase 项目中访问数据和资源。本文提供详细的代码示例和步骤,帮助开发者避免常见的初…

    2025年12月21日
    000
  • 构建动态嵌套选项卡:实现点击主选项卡显示子选项卡及内容

    本文详细介绍了如何使用html、css和纯javascript构建一个两级动态选项卡界面。核心在于实现点击主选项卡(如“apps”)时,动态显示第二层子选项卡(如“app 1”、“app 2”、“app 3”),并默认激活其中一个子选项卡及其内容,同时确保在点击其他主选项卡时隐藏子选项卡,从而优化用…

    2025年12月21日
    000
  • WebRTC与JavaScript实时通信应用

    WebRTC通过getUserMedia、RTCPeerConnection和RTCDataChannel等API实现浏览器间音视频通话与数据传输,结合信令服务器(如WebSocket)交换SDP和ICE候选,利用STUN/TURN穿透NAT和防火墙,完成P2P连接建立,支持实时通信应用开发。 We…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信