新闻中心

如何用Web Components封装跨框架的业务组件?

2025-10-05
浏览次数:
返回列表
Web Components通过Custom Elements、Shadow DOM和HTML Templates实现跨框架复用。1. 使用customElements.define定义自定义标签,如user-info-card;2. Shadow DOM隔离样式与逻辑,避免全局污染;3. 通过observedAttributes监听属性变化,dispatchEvent抛出事件实现通信;4. 可打包为npm包,供React、Vue等项目直接引入使用,实现一次封装、多处运行。

如何用web components封装跨框架的业务组件?

Web Components 是一套浏览器原生支持的技术,能让你创建可复用、封装良好且不依赖框架的 UI 组件。用它封装跨框架的业务组件,核心在于利用其三大特性:自定义元素(Custom Elements)、影子 DOM(Shadow DOM)和 HTML 模板(HTML Templates)。这样封装的组件可以在 React、Vue、Angular 甚至纯 HTML 项目中直接使用。

1. 使用 Custom Elements 定义组件标签

通过 customElements.define() 注册一个自定义 HTML 标签,这是跨框架使用的入口。

例如,封装一个用户信息卡片:
class UserInfoCard extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }
<p>connectedCallback() {
const name = this.getAttribute('name') || '未知';
const *atar = this.getAttribute('*atar');</p><pre class='brush:php;toolbar:false;'>this.shadowRoot.innerHTML = `
  <div class="card">
    <img src="${*atar}" alt="头像" />
    <span>${name}</span>
  </div>
`;

} }

customElements.define('user-info-card', UserInfoCard);

之后在任意框架中都可以直接写:

<user-info-card name="张三" *atar="/*atar.png"></user-info-card>

2. 利用 Shadow DOM 实现样式与逻辑隔离

影子 DOM 能防止外部 CSS 干扰组件内部结构,也能避免组件样式“泄漏”到全局,这对跨项目复用非常关键。

在上面的例子中,this.attachShadow({ mode: 'open' }) 创建了独立的作用域,组件内的样式不会影响页面其他部分。

你可以在 shadowRoot 中注入样式:
this.shadowRoot.innerHTML = `
  <style>
    .card {
      display: flex;
      align-items: center;
      padding: 8px;
      border: 1px solid #ddd;
      border-radius: 4px;
    }
    img {
      width: 32px;
      height: 32px;
      border-radius: 50%;
      margin-right: 8px;
    }
  </style>
  <div class="card">
    @@##@@
    <span>${name}</span>
  </div>
`;

3. 支持属性传值与事件通信

为了让组件更灵活,需支持从外部传入数据并对外抛出事件,这能让它在 React 或 Vue 中像普通组件一样绑定 props 和 listeners。

JTBC网站内容管理系统5.0.3.1 JTBC网站内容管理系统5.0.3.1

JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也

JTBC网站内容管理系统5.0.3.1 3 查看详情 JTBC网站内容管理系统5.0.3.1
  • 通过 observedAttributes 监听属性变化
  • 使用 attributeChangedCallback 响应变更
  • 通过 this.dispatchEvent() 派发自定义事件
示例:点击用户卡片触发事件
static get observedAttributes() {
  return ['name', '*atar'];
}
<p>attributeChangedCallback(name, oldValue, newValue) {
if (oldValue !== newValue) {
this.render();
}
}</p><p>render() {
const name = this.getAttribute('name') || '未知';
const *atar = this.getAttribute('*atar') || 'default.png';</p><p>this.shadowRoot.innerHTML = <code><!-- 同上 --></code>;</p><p>// 绑定事件
this.shadowRoot.querySelector('.card').onclick = () => {
this.dispatchEvent(new CustomEvent('view-profile', {
detail: { name }
}));
};
}

在 Vue 或 React 中监听:

<user-info-card name="李四" @view-profile="handleClick" />

4. 构建与发布为 npm 包(可选)

如果你希望多个项目共用这个组件,可以将其打包成 npm 包。

  • 使用 Vite、Rollup 等工具将组件构建成标准 ES Module
  • 导出类或调用 define 方法的函数
  • 在目标项目中 import 并注册即可使用
main.js 中注册:
import { UserInfoCard } from 'my-components';
customElements.define('user-info-card', UserInfoCard);

基本上就这些。Web Components 的优势在于“一次封装,到处使用”,只要浏览器支持,就能在任何技术栈中嵌入。关键是做好属性通信、样式隔离和事件机制,让组件行为清晰可控。头像

以上就是如何用Web Components封装跨框架的业务组件?的详细内容,更多请关注其它相关文章!


# 复用  # 莆田seo怎么做  # 合肥公众号营销推广招聘  # 线上电商推广营销策略  # 河源工业网站建设  # 网站推广建站方法是什么  # 辽阳关键词排名生产公司  # 临江百度网站优化  # 乡镇企业导报网站建设  # 淘宝关键词排名搜索工具  # 网站建设的机构  # 这是  # 服务端  # 抛出  # 绑定  # 第三方  # 跨框架  # 如何用  # 有什么  # 内容管理系统  # 自定义  # 作用域  # ai  #   # 工具  # 浏览器  # vite  # js  # html  # react  # vue  # css 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  学习通网页版快速入口 学习通官网网页版直接打开  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  React/Next.js中实现列表项的动态选择与移动  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  快手赚钱渠道_快手收益来源  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  Golang如何使用const iota_Go iota常量计数器讲解  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  如何在J*a中使用Locale处理多语言环境  Lar*el Excel导入时生成自定义递增ID的策略与实践  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  京东单号查询入口_京东快递订单追踪入口  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  Django表单验证失败时保留用户输入数据的最佳实践  Tailwind CSS line-clamp 布局问题解析与修复指南  零跑汽车11月交付量达70327台 实现连续9个月正增长  PDF文件体积过大处理_PDF压缩技巧详解  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  AI泡沫首次被“刺破”:GPU十年都无法存活!  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  菜鸟取件码是什么怎么查 最全查询渠道汇总  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  解决深度学习模型训练初期异常高损失与完美验证准确率问题  Eclipse怎么运行工程_Eclipse工程运行配置说明  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  必由学官方平台入口 必由学在线课堂登录地址  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  C++如何生成随机数_C++ random库使用方法与范围设置  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  使用J*aScript检测输入元素是否包含在特定类中  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  J*aScript map 迭代中检测空数组元素的有效方法  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  AO3官网镜像链接 Archive of Our Own同人文在线浏览  poki免费入口快捷访问 poki人气小游戏直接玩站点  解决移动端滚动问题的overflow属性应用指南  如何在 Windows 11 中启动游戏手柄设置  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  可靠CSGO开箱平台解析 CSGO开箱网合集 

搜索