当前位置:首页 > 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 允许将特定内容分发到子组件的指定位置。

js实现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 内容。

js实现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> 实现更灵活的组件结构。

<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 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterv…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现乘

js实现乘

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