javascript怎样创建可重用组件_Web Components是什么【教程】
技术百科
夢幻星辰
发布时间:2026-01-28
浏览: 次 Web Components 是浏览器原生标准,含 Custom Elements(需含短横线、继承 HTMLElement、用 define 注册)、Shadow DOM(open/closed 模式、slot 分发、样式隔离)和 template 克隆机制,但无内置响应式,通信依赖属性/事件。
Web Components 不是“教程式框架”,而是浏览器原生支持的一套标准,用它创建的组件天然可重用、无框架依赖、能跨项目移植——但直接手写完整生命周期和样式隔离,容易踩坑。
什么是 Custom Elements?
Custom Elements 是 Web Components 的核心之一,允许你定义自己的 HTML 标签,比如 或 。它必须继承 HTMLElement,且标签名里必须含短横线(-),否则浏览器会拒绝注册。
- 注册必须在
customElements.define()中完成,且只能注册一次;重复注册会抛错Failed to execute 'define' on 'CustomElementRegistry': the name "xxx" has already been used - 构造函数中不能直接操作
this.shadowRoot(因为此时可能还没 attach),应改用connectedCallback - 若需响应属性变化,得显式声明
observedAttributes静态 getter,并实现attributeChangedCallback
如何用 Shadow DOM 实现样式与结构隔离?
Shadow DOM 是让组件真正“自包含”的关键:它的样式不会泄漏出去,外部样式也进不来。但默认是 open 模式,意味着可通过 el.shadowRoot 访问——如果不想被外部篡改,应设为 closed(不过调试会变困难)。
- 创建 shadow roo
t 时推荐用
this.attachShadow({ mode: 'open' }),避免 IE 兼容问题(IE 完全不支持) -
是内容分发点,但注意:没有name的只能接收匿名内容;多个具名需配合- Shadow DOM 内无法用
:host-context(...)响应外部 CSS 主题,更可靠的方式是监听document.documentElement类名变化或使用 CSS 自定义属性传参HTML Templates + Custom Elements 怎么组合才不翻车?
把模板逻辑写死在
connectedCallback里容易重复渲染;用标签预存结构,再克隆插入,才是稳定做法。立即学习“Java免费学习笔记(深入)”;
- 模板必须放在
外(如或页面顶部),否则解析时会被当作普通文本丢弃 - 克隆后要调用
content.cloneNode(true),否则后续修改会影响原始模板 - 若模板含
或动态绑定(如{{value}}),Web Components 本身不处理——得自己实现或引入轻量模板引擎 - 事件委托要小心:
shadowRoot是事件边界,默认click不会冒泡到 light DOM,需手动composed: true触发
真正难的不是语法,是状态管理与跨组件通信:Web Components 没有内置响应式系统,父子传参靠属性/事件,兄弟通信得靠自定义事件 +
dispatchEvent向上抛,再由共同父级转发——这点很容易被忽略,结果写出来一堆紧耦合的“伪组件”。 - Shadow DOM 内无法用
# ai
# 放在
# 自己的
# 才是
# 多个
# 自定义
# 很容易
# 还没
# 浏览器
# css
# 设为
# 不支持
# 堆
# javascript
# java
# html
# 构造函数
# 委托
# 事件
# this
# node
# define
# 继承
# dom
# table
# 发点
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Mac如何解压zip和rar文件?(推荐免费工具)
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- MAC如何启用访达侧边栏显示_MAC Finder
- Win10怎样卸载TeamViewer_Win10
- Python代码测试策略_质量保障解析【教程】
- c# 如何用c#实现一个支持优先级的任务队列
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- Win11局域网共享怎么设置 Win11文件夹网络
- Win11怎么设置ip地址_Windows 11手
- Mac的“预览”如何合并多个PDF_Mac文件处理
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- Golang如何测试HTTP中间件_Golang
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- php报错怎么查看_定位PHP致命错误与警告的方法
- c++如何获取map中所有的键_C++遍历键值对提
- Windows10系统服务优化指南_Win10禁用
- Windows 11如何查看系统激活密钥_Wind
- php增删改查报错1054怎么办_字段名错误排查修
- 如何使用Golang实现文件加密_Golang c
- Win11讲述人怎么关闭_Win11误触开启语音朗
- Windows怎样关闭开始菜单推荐广告_Windo
- Win11怎么设置屏保_Windows 11屏幕保
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- Win11怎么设置DNS服务器_Windows11
- c++的STL算法库find怎么用 在容器中查找指
- C#如何序列化对象为XML XmlSerializ
- PythonPandas数据分析教程_数据清洗与处
- c++如何实现一个高性能的环形队列(Ring Bu
- Drupal 中渲染节点时出现 HTML 标签嵌套
- 如何使用Golang实现容器安全扫描_Golang
- Mac如何查看电池健康百分比_Mac系统信息电源检
- Windows执行文件被SmartScreen拦截
- Win10怎样卸载自带Edge_Win10卸载Ed
- Win11怎么设置默认输入法 Win11固定中文输
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Win11怎么关闭通知消息_屏蔽Windows 1
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- 如何使用Golang实现微服务事件驱动_使用消息总
- Win11怎么关闭自动修复_跳过Win11开机自动
- Win11怎么关闭搜索历史_Win11清除设备上的
- 如何使用 Python 合并文件夹内多个 Exce
- 如何在Golang中实现CI/CD流水线自动化测试
- Python对象生命周期管理_创建销毁说明【指导】
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Win11关机界面怎么改_Win11自定义关机画面
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- Win11如何隐藏桌面图标 Win11一键隐藏/显


QQ客服