新闻中心
如何用Web Components封装跨框架的业务组件?
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 是一套浏览器原生支持的技术,能让你创建可复用、封装良好且不依赖框架的 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 CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也
3
查看详情
- 通过 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 并注册即可使用
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开箱网合集


2025-10-05
浏览次数:次
返回列表
Custom Elements 定义组件标签