<slot>
是在自訂元素 內部 <template>
定義的插槽 ,任何 放在自訂元素 標籤 間的最上層 HTML 元素或文字,會插入 <slot>
裡面。
沒有 指定插槽名稱 的,會放入 default slot (也就是沒有 名稱 的 <slot>
)。
1️⃣ 決定 <slot> 位置 2️⃣ 加入 HTML 內容
📁 自訂元素 的 <template> 中:定義 <slot>
的位置(也可以放 named slot )
Copy <template id="my-component-template">
<style>
.container {
border: 1px solid blue;
padding: 10px;
}
</style>
<div class="container">
<p>This is some default text.</p>
<!-- ⭐️ 1️⃣ 決定 <slot> 位置 -->
<slot></slot>
<p>This is more default text.</p>
</div>
</template>
📁 HTML:在自訂元素 標籤 (如:<my-component>
) 中加入 HTML 內容
Copy <my-component>
<!-- ⭐️ 2️⃣ 加入 HTML 內容 -->
<!-- 沒有指定插槽名稱的,會放入 default slot -->
<h2>This is the slotted content!</h2>
<p>This is another paragraph inside the slot.</p>
</my-component>
但最終呈現的結果則由自訂元素 <template> 內所定義的結構決定。
Copy constructor() {
super();
let root = this.attachShadow({ mode: 'open' }); // root == this.shadowRoot
// ... (其他程式碼)
// ⭐️ "slotchange" event
const slot = root.querySelector('slot');
slot.addEventListener('slotchange', (event) => {
console.log('Slot 內容發生變化!');
const slottedNodes = slot.assignedNodes();
console.log('Slotted nodes:', slottedNodes);
});
}