当前位置:首页 > JavaScript

js实现slot

2026-02-02 03:13:35JavaScript

实现 Slot 的基本概念

Slot 是 Web 组件中用于内容分发的机制,允许父组件向子组件传递内容。在原生 HTML 和 JavaScript 中,可以通过 <slot> 元素实现类似 Vue 或 React 中的插槽功能。

使用 Shadow DOM 创建 Slot

Shadow DOM 允许将组件的内部结构与外部 DOM 隔离,同时通过 <slot> 元素实现内容分发。

<!DOCTYPE html>
<html>
<head>
  <title>Slot Example</title>
</head>
<body>
  <custom-element>
    <p>This content will be slotted</p>
  </custom-element>

  <script>
    class CustomElement extends HTMLElement {
      constructor() {
        super();
        const shadow = this.attachShadow({ mode: 'open' });
        shadow.innerHTML = `
          <div>
            <slot></slot>
          </div>
        `;
      }
    }
    customElements.define('custom-element', CustomElement);
  </script>
</body>
</html>

命名 Slot 的实现

命名 Slot 允许将特定内容分发到子组件的指定位置。

<custom-element>
  <p slot="header">Header Content</p>
  <p slot="footer">Footer Content</p>
</custom-element>

<script>
  class CustomElement extends HTMLElement {
    constructor() {
      super();
      const shadow = this.attachShadow({ mode: 'open' });
      shadow.innerHTML = `
        <div>
          <slot name="header"></slot>
          <slot name="footer"></slot>
        </div>
      `;
    }
  }
  customElements.define('custom-element', CustomElement);
</script>

默认 Slot 和 Fallback 内容

如果未提供分发内容,Slot 可以显示默认的 Fallback 内容。

<custom-element></custom-element>

<script>
  class CustomElement extends HTMLElement {
    constructor() {
      super();
      const shadow = this.attachShadow({ mode: 'open' });
      shadow.innerHTML = `
        <div>
          <slot>Default Content</slot>
        </div>
      `;
    }
  }
  customElements.define('custom-element', CustomElement);
</script>

动态 Slot 内容分发

通过 JavaScript 动态操作 Slot 内容。

<custom-element id="dynamic-slot"></custom-element>

<script>
  class CustomElement extends HTMLElement {
    constructor() {
      super();
      const shadow = this.attachShadow({ mode: 'open' });
      shadow.innerHTML = `
        <div>
          <slot name="dynamic"></slot>
        </div>
      `;
    }
  }
  customElements.define('custom-element', CustomElement);

  const element = document.getElementById('dynamic-slot');
  const content = document.createElement('p');
  content.textContent = 'Dynamic Content';
  content.slot = 'dynamic';
  element.appendChild(content);
</script>

Slotchange 事件监听

通过 slotchange 事件监听 Slot 内容的变化。

<custom-element>
  <p slot="changeable">Changeable Content</p>
</custom-element>

<script>
  class CustomElement extends HTMLElement {
    constructor() {
      super();
      const shadow = this.attachShadow({ mode: 'open' });
      shadow.innerHTML = `
        <div>
          <slot name="changeable"></slot>
        </div>
      `;
      const slot = shadow.querySelector('slot');
      slot.addEventListener('slotchange', (e) => {
        console.log('Slot content changed:', e.target.assignedNodes());
      });
    }
  }
  customElements.define('custom-element', CustomElement);
</script>

多 Slot 内容分发

在单个组件中使用多个 Slot 分发不同内容。

<custom-element>
  <p slot="title">Title</p>
  <p slot="description">Description</p>
</custom-element>

<script>
  class CustomElement extends HTMLElement {
    constructor() {
      super();
      const shadow = this.attachShadow({ mode: 'open' });
      shadow.innerHTML = `
        <div>
          <h1><slot name="title"></slot></h1>
          <p><slot name="description"></slot></p>
        </div>
      `;
    }
  }
  customElements.define('custom-element', CustomElement);
</script>

使用模板和 Slot

结合 <template><slot> 实现更灵活的组件结构。

js实现slot

<template id="templated-element">
  <style>
    div { border: 1px solid #ccc; padding: 10px; }
  </style>
  <div>
    <slot name="header"></slot>
    <slot></slot>
  </div>
</template>

<custom-template>
  <h1 slot="header">Header</h1>
  <p>Default slot content</p>
</custom-template>

<script>
  class CustomTemplate extends HTMLElement {
    constructor() {
      super();
      const template = document.getElementById('templated-element');
      const shadow = this.attachShadow({ mode: 'open' });
      shadow.appendChild(template.content.cloneNode(true));
    }
  }
  customElements.define('custom-template', CustomTemplate);
</script>

注意事项

  • Shadow DOM 的 mode 设置为 open 时,外部 JavaScript 可以访问组件的 Shadow DOM。
  • 命名 Slot 必须与分发内容的 slot 属性匹配。
  • slotchange 事件仅在 Slot 内容变化时触发,不包括初始渲染。

标签: jsslot
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…