具名插槽的 slot name 必须严格区分大小写且精确匹配,浏览器不转换大小写;一个 shadow dom 可含多个具名插槽和唯一默认插槽;分发仅作用于自定义元素的直系子节点;name 属性不可动态绑定或运行时修改。

slot name 必须严格匹配且区分大小写
具名插槽的分发完全依赖字符串精确比对:
调试时若内容没出现,优先检查控制台输出的 assignedNodes() 是否为空;空数组往往意味着 name 值不一致,而非逻辑错误。
多个 slot 共存需明确角色分工
一个 Shadow DOM 内可同时存在:
- 任意数量的具名插槽,如
<slot name="header"></slot>、<slot name="footer"></slot> - 且最多只能有一个默认插槽(无 name 属性)——它接收所有未被具名插槽捕获的直系子节点
- 重复声明同名插槽(如两个
<slot name="item"></slot>)是允许的,但 Light DOM 中每个slot="item"元素只会进入第一个匹配的 slot,后续同名 slot 保持空
内容必须是自定义元素的直系子节点
分发只扫描自定义标签的直接子元素,不递归后代:
- ✅
<my-card><h1 slot="title">标题</h1> <p>正文</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3458" title="html-ppt-to-pdf"><img src="https://img.php.cn/upload/skill/000/000/081/178956546773641.jpg" alt="html-ppt-to-pdf" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill3458" title="html-ppt-to-pdf" class="overflowclass">html-ppt-to-pdf</a> <p class="overflowclass">将使用 `<section class="slide">` 约定的 HTML 幻灯片转换为高保真、矢量文本 PDF(使用 Playwright + Chromium 原生 PDF 功能)。</p> </div> <a rel="nofollow" href="/xiazai/skill3458" title="html-ppt-to-pdf" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div></my-card>→<h1></h1>能进name="title"插槽,<p></p>进默认插槽 - ❌
<my-card><div><h1 slot="title">标题</h1></div></my-card>→<h1></h1>是孙节点,不参与分发,会被丢弃
这个限制不是 bug,而是 Shadow DOM 分发机制的设计前提,无法绕过。
动态切换插槽名不可行,需用条件渲染替代
name 属性是纯静态字符串,不支持绑定或表达式:
- ❌
<slot :name="currentSlot"></slot>(Vue 模板中未用 v-bind)实际解析为字面量name="currentSlot" - ❌
<slot name="{{ name }}"></slot>或<slot name="${name}"></slot>在 HTML 源码中无效 - ✅ 正确做法:并列多个具名插槽 + CSS 控制显示,例如
<slot name="header-v1"></slot><slot name="header-v2"></slot>,再用display: none切换可见性
运行时调用 setAttribute('name', ...) 也无效——分发在元素连接(connectedCallback)时已完成,改 name 不触发重分发。










