本身不取数,仅作内容分发占位符;需配合 slotchange 事件与 assignedNodes() 手动提取数据,但推荐优先使用属性、事件、方法传递结构化数据。
Web Components 中的 本身不“取数”,它只是内容分发(content distribution)的占位符,不会主动读取、提取或返回数据。所谓“取 Web Components 数据”,实际是通过组合使用 + 属性/事件/方法 + 父子通信机制来实现的。
的作用是在自定义元素内部“挖个洞”,让外部传入的 HTML 片段能渲染到指定位置。它不解析内容、不序列化数据、不触发响应式更新。
H
ello → 显示 “Hello”,但组件内拿不到字符串 “Hello” 除非手动查 slot.assignedNodes()
→ 渲染图片,但 data-id 不会自动变成组件的属性value、textContent 或类似 React 的 props.children 返回值;它只有 assignedNodes() 和 assignedElements() 这类只读查询方法如果真需要从插槽里提取结构化信息(比如提取子元素的 data- 属性、文本内容或输入值),必须在组件内部监听 slotchange 事件,并调用 assignedNodes() 手动分析。
class MyForm extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
`;
const slot = this.shadowRoot.querySelector('slot');
slot.addEventListener('slotchange', () => {
const nodes = slot.assignedNodes({ flatten: true });
// 注意:nodes 是 NodeList,不是实时集合,需重新获取
for (const node of nodes) {
if (node.nodeType === Node.ELEMENT_NODE && node.hasAttribute('data-value')) {
console.log('从 slot 元素拿到:', node.dataset.value);
}
}
});
}
}
assignedNodes({ flatten: true }) 才能穿透 嵌套,拿到最底层真实节点nodeType === 3)需用 node.textContent.trim() 提取,但注意前后空格和换行slotchange,得手动调用 slot.assignedNodes()
把 slot 当作“数据源”容易踩坑——内容不可控、时机难把握、类型无保障。真正健壮的做法是明确划分职责:
→ 组件内直接解析 this.getAttribute('data')
this.dispatchEvent(new CustomEvent('submit', { detail: { value: this.input.value } }))
myChart.getValue() 或 myChart.setData([...])
命名插槽(name="xxx")不是模糊匹配,它严格按 slot 属性值一对一绑定,且不支持通配或 fallback 自动降级。
Hi
→ 只有 能接住,但用户写了 ...
,这部分内容会被丢弃(不显示也不报错)slot 不会合并内容,只会取第一个;多个同名外部元素也不会拼接,而是全部投射到同一个 中name)接收所有未被命名插槽捕获的节点,但它不能和 name="" 混用 —— 后者是无效值,等同于无名slot 的本质是声明式布局工具,不是数据桥接层。想让它“取数”,等于让插座去读电器型号——得靠额外电路(代码逻辑)配合才行。真正该花时间设计的是属性契约、事件规范和方法接口,而不是在 assignedNodes() 里反复 parse DOM。