如何通过 J*aScript 的 Web Components 技术创建可复用的自定义元素?


答案:Web Components 通过 Custom Elements、Shadow DOM 和 HTML Templates 封装可复用组件。首先定义继承 HTMLElement 的类并用 customElements.define() 注册自定义标签,实现基础行为;接着在构造函数中调用 attachShadow() 创建 Shadow DOM,隔离内部结构与样式,避免全局污染;然后结合 预定义组件模板,提升渲染性能与代码组织性;最后通过 observedAttributes() 监听属性变化,在 attributeChangedCallback 中响应更新,实现动态交互。示例包括 my-button、my-card、my-alert 和 my-toggle 等组件,支持内容分发(slot)和状态切换。该技术原生支持现代浏览器,适用于构建高内聚、低耦合的 UI 组件库,尤其适合跨项目复用和设计系统建设。

如何通过 javascript 的 web components 技术创建可复用的自定义元素?

使用 J*aScript 的 Web Components 技术创建可复用的自定义元素,核心在于结合 Custom ElementsShadow DOMHTML Templates 三大标准 API。这样可以封装样式、结构和行为,实现真正独立、可复用的组件。

定义并注册自定义元素

通过 customElements.define() 方法注册一个继承自 HTMLElement 的类,即可创建自定义 HTML 标签。

class MyButton extends HTMLElement { constructor() { super(); // 初始化逻辑 this.textContent = this.getAttribute('label') || '点击我'; this.style.padding = '10px 20px'; this.style.background = '#007bff'; this.style.color = 'white'; this.style.borderRadius = '4px'; this.style.cursor = 'pointer'; }

connectedCallback() { // 元素插入页面时绑定事件 this.addEventListener('click', () => { alert('按钮被点击!'); }); } }

customElements.define('my-button', MyButton);

之后就能在 HTML 中直接使用:<my-button label="提交"></my-button>

使用 Shadow DOM 封装内部结构

Shadow DOM 能隔离组件的样式和结构,避免与页面其他部分冲突。

class MyCard extends HTMLElement { constructor() { super(); // 创建影子根 const shadow = this.attachShadow({ mode: 'open' });
// 构建内部结构
const wrapper = document.createElement('div');
wrapper.innerHTML = `
  <style>
    .card {
      border: 1px solid #ddd;
      border-radius: 8px;
      padding: 16px;
      background: #f9f9f9;
      box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    }
    h3 { margin-top: 0; color: #333; }
  </style>
  <div class="card">
    <h3>${this.getAttribute('title') || '默认标题'}</h3>
    <slot></slot> <!-- 支持内容分发 -->
  </div>
`;

shadow.appendChild(wrapper);

} }

customElements.define('my-card', MyCard);

用法示例:

姓名:张三

年龄:25

Facetune Facetune

一款在线照片和视频编辑工具,允许用户创建AI头像

Facetune 109 查看详情 Facetune

结合

将组件模板写在 <template></template> 中,可以提前声明结构,延迟渲染,提高效率。

<script> class MyAlert extends HTMLElement { constructor() { super(); const template = document.getElementById('my-alert-template'); const content = template.content.cloneNode(true); this.attachShadow({ mode: 'open' }).<a style="color:#f60; text-decoration:underline;" title= "app"href="https://www.php.cn/zt/16186.html" target="_blank">appendChild(content); } } customElements.define('my-alert', MyAlert); </script>

这样写更清晰,尤其适合复杂组件。

支持属性监听与状态更新

通过 static get observedAttributes() 监听属性变化,动态更新组件。

class MyToggle extends HTMLElement { static get observedAttributes() { return ['on']; }

constructor() { super(); this.attachShadow({ mode: 'open' }); this.render(); }

attributeChangedCallback(name, oldValue, newValue) { if (name === 'on') { this.render(); } }

render() { const isOn = this.hasAttribute('on'); this.shadowRoot.innerHTML = <button style=" background: ${isOn ? '#28a745' : '#dc3545'}; color: white; border: none; padding: 8px 16px; border-radius: 4px; "> ${isOn ? '开启' : '关闭'} </button> ; } }

customElements.define('my-toggle', MyToggle);

调用方式:<my-toggle on></my-toggle> 或通过 JS 修改属性触发更新。

基本上就这些。Web Components 原生支持现代浏览器,无需框架也能构建高复用、低耦合的 UI 组件,特别适合设计系统或跨项目共享组件。不复杂但容易忽略细节,比如 Shadow DOM 的样式隔离机制和 slot 使用规范。掌握后能显著提升前端工程化能力。

以上就是如何通过 J*aScript 的 Web Components 技术创建可复用的自定义元素?的详细内容,更多请关注其它相关文章!


# 三大  # 高青县网站建设  # 德州网站优化平台  # 直通车怎么用seo  # 网站推广技术推 荐乐云seo  # 一站式网站推广优化价格  # 做网站建设推广赚钱吗  # 舟山慧抖销seo优化  # 推广品牌营销案例  # SEO各个标签的含义  # 云南seo计划  # 提示信息  # 能在  # 适用于  # javascript  # 也能  # 压缩解压  # 键值  # 最短  # 复用  # 自定义  # app  # 浏览器  # node  # 前端  # js  # html  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: word表格如何按某一列内容进行排序_Word表格按列排序方法  英雄联盟争者留名活动介绍  PHP utf8_encode 字符编码转换陷阱与解决方案  个人所得税办理入口 个人所得税综合所得年度汇算入口  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  Composer如何使用composer-plugin-api开发自定义插件  苹果如何下载nanobanana  C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例  J*aScript实现网页表单实时输入字段比较与验证教程  《i莞家》修改昵称方法  免费占卜在线神算_免费占卜手机神算  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  苹果手机聊天记录删除了如何恢复  如何取消数字签名  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析  手机远程连接电脑方法  《长生:天机降世》火塔小怪大全  三角洲行动2025年9月10日摩斯密码分享  苹果官网国补入口在哪  realme 10 Pro息屏方案_realme 10 Pro省电策略  word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法  获取WooCommerce产品在后台编辑页面的分类ID  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  123平台官方登录入口 123邮箱网页端在线沟通工具  PHP多语言网站的实现:会话管理与翻译函数优化教程  极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方  WooCommerce 新客户订单自动添加管理员备注教程  英国搜索:多数英国人认为语言搜索是未来搜索  小红书网页版首页入口 小红书网页版电脑端官方登录链接  OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧  苹果手机手电筒无法开启  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  mysql中如何分析索引使用情况_mysql索引使用分析方法  火柴人战争网页版在线玩  Go App Engine 项目结构与包管理深度指南  C#解析来自网络的XML流数据 实时错误处理与重试机制  教资成绩怎么查询  德邦快递查询入口登录官网 德邦快递单号查询系统入口  Win10怎么设置快速启动 Win10开启快速启动设置方法  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案  Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足 

 2025-10-09

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.