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; ?>
】
相关推荐
- Win10系统更新错误0x80240034怎么办
- Windows10系统怎么查看显卡型号_Win10
- 如何在Golang中实现文件下载_Golang文件
- Python数据抓取合法性_合规说明【指导】
- php控制舵机角度怎么调_php发送pwm信号控制
- Go语言中正确反序列化多个同级XML元素为结构体切
- Linux怎么查找死循环进程_Linux系统负载分
- php中$this和::能混用吗_对象与静态作用域
- php文件怎么变mp4保存_php输出视频流保存为
- Python函数接口文档化_自动化说明【指导】
- C++如何编写函数模板?(泛型编程入门)
- 如何使用Golang构建基础消息队列模拟_Gola
- Win11怎么关闭系统推荐内容_Windows11
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- Win11怎么关闭搜索历史 Win11清除搜索框最
- 如何使用Golang开发基础文件下载功能_Gola
- Win11系统占用空间大怎么办 Win11深度瘦身
- Win11怎么关闭用户账户控制UAC_Window
- Win10怎样卸载自带Edge_Win10卸载Ed
- 如何在Golang中修改数组元素_通过指针实现原地
- php怎么下载安装后设置默认字符集_utf8配置步
- Win11怎么开启游戏工具栏_Windows11
- Windows怎样拦截QQ浏览器广告_Window
- c++中的Tag Dispatching是什么_c
- Win11任务栏颜色怎么改_Win11自定义任务栏
- 如何使用Golang搭建本地API测试环境_快速验
- 如何将竖排文本文件转换为横排字符串
- Win11 explorer.exe频繁崩溃_修复
- php打包exe怎么传递参数_命令行参数接收方法【
- 为什么Go需要go mod文件_Go go mod
- c++协程和线程的区别 c++异步编程模型对比【核
- Windows10如何删除Windows.old_
- 如何有效拦截拼接式恶意域名的垃圾信息
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Win11如何设置环境变量 Win11添加和修改系
- 如何使用Golang搭建Web开发环境_快速启动H
- Windows10如何查看保存的WiFi密码_Wi
- php转mp4怎么保留字幕_php处理带字幕视频转
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- Windows蓝屏错误0x00000018怎么处理
- 如何使用Golang开发简单的聊天室消息存储_Go
- Win11怎么清理C盘虚拟内存_Win11清理虚拟
- Go 中 defer 语句在 goroutine
- Win10怎样安装PPT模板_Win10安装PPT
- Win11怎么开启专注模式_Windows11时钟
- Windows10系统怎么查看设备管理器_Win1
- Windows11怎么自定义任务栏_Windows
- Win11怎么退出微软账户_切换Win11为本地账
- 短链接还原php提示内存不足_调整PHP内存限制设


QQ客服