Slots

  1. <slot><!-- optional fallback --></slot>
  1. <slot name="x"><!-- optional fallback --></slot>
  1. <slot prop={value}></slot>

和原生的 DOM 元素一样,组件在使用的时候也可以有子内容。

子内容会替代在组件中使用 <slot> 包裹的内容,如果没有向插槽提供内容的时候,<slot> 包裹的内容会作为默认内容返回。

  1. <!-- App.svelte -->
  2. <Widget>
  3. <p>this is some child content</p>
  4. </Widget>
  5. <!-- Widget.svelte -->
  6. <div>
  7. <slot>
  8. this will be rendered if someone does <Widget/>
  9. </slot>
  10. </div>

具名插槽允许开发者指定特定插槽的内容,当然他们也可以有默认内容。

  1. <!-- App.svelte -->
  2. <Widget>
  3. <h1 slot="header">Hello</h1>
  4. <p slot="footer">Copyright (c) 2019 Svelte Industries</p>
  5. </Widget>
  6. <!-- Widget.svelte -->
  7. <div>
  8. <slot name="header">No header was provided</slot>
  9. <p>Some content between header and footer</p>
  10. <slot name="footer"></slot>
  11. </div>

插槽可渲染零次或多次,可通过 props 把值回传给父级。父级可以可以通过 let: 指令把值传给插槽模版。

常用简洁的方式来写- let:item 表示 let:item={item} ,而且 <slot {item}> 等同于 <slot item={item}>

  1. <!-- App.svelte -->
  2. <FancyList {items} let:item={item}>
  3. <div>{item.text}</div>
  4. </FancyList>
  5. <!-- FancyList.svelte -->
  6. <ul>
  7. {#each items as item}
  8. <li class="fancy">
  9. <slot item={item}></slot>
  10. </li>
  11. {/each}
  12. </ul>

具名插槽也可以暴露一个值给父级,通过在元素上使用对应的 let: 指令获取暴露的属性。

  1. <!-- App.svelte -->
  2. <FancyList {items}>
  3. <div slot="item" let:item={item}>{item.text}</div>
  4. <p slot="footer">Copyright (c) 2019 Svelte Industries</p>
  5. </FancyList>
  6. <!-- FancyList.svelte -->
  7. <ul>
  8. {#each items as item}
  9. <li class="fancy">
  10. <slot name="item" item={item}></slot>
  11. </li>
  12. {/each}
  13. </ul>
  14. <slot name="footer"></slot>