# 动态 slot

由于目前 glass-easel 组件框架仅可用于 Skyline 渲染引擎,因此这些特性也同样受此限制。

# 静态 slot 与动态 slot

简单的自定义组件 slot 类型有两种:单一 slot 和多 slot ,取决于自定义组件的 multipleSlots 选项。它们都属于静态 slot 。

它们都要求(相同 name 的) slot 节点只有一个,重复的 <slot /> 中只有第一个会生效。

之所以称其为“静态”,是因为无论组件的实现如何, slot 的内容(由组件使用者提供)只会出现一次,不会因 <slot /> 的重复而重复。这样组件的使用者更容易控制它自身的节点。

从性能上看,单一 slot 也具有相对最优的性能表现。

但有时需要在列表中使用 slot 使得 slot 的内容被重复多次。此时可以使用动态 slot 。

Component({
  options: {
    dynamicSlots: true, // 启用动态 slot
  },
  data: {
    list: ['A', 'B', 'C'],
  },
})

然后,在模板中可以使 <slot /> 重复多次:

<block wx:for="{{ list }}">
  <slot />
</block>

# 通过动态 slot 传递数据

在动态 slot 中,被重复的 <slot /> 可以分别携带不同的数据。例如:

<block wx:for="{{ list }}">
  <slot list-index="{{ index }}" item="{{ item }}" />
</block>

上述的 slot 中携带有 list-indexitem 两个数据项。

组件的使用者可以通过 slot: 来接收 slot 传递的任何数据项。例如:

<view>
  <child>
    <view slot:item>{{ item }}</view>
    <view slot:listIndex>{{ listIndex }}</view>
  </child>
</view>

组件的使用者在接收 slot 传递的数据项时,可以更改数据项的字段名。例如:

<view>
  <child>
    <view slot:listIndex="index">{{ index }}</view>
  </child>
</view>