具名插槽

app.vue

<template>
  <div>
    <BaseLayout>
      <template v-slot:todo="{ todo }">
        <span v-if="todo.isComplete">✓</span>
        {{ todo.text }}
      </template>
    </BaseLayout>
  </div>
</template>

BaseLayout.vue

<template>
  <div>
    <ul>
      <li v-for="todo in filteredTodos" v-bind:key="todo.id">
        <slot name="todo" :todo="todo">
          <!-- 后备内容 -->
          {{ todo.text }}
        </slot>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "BaseLayout",
  data() {
    return {
      filteredTodos: [
        { id: "001", text: "aaa", isComplete: true },
        { id: "002", text: "bbb", isComplete: true },
        { id: "003", text: "ccc", isComplete: false },
        { id: "004", text: "ddd", isComplete: true },
        { id: "005", text: "eee", isComplete: true },
      ],
    };
  },
};
</script>

子组件中slot标签下的name属性后的todo需要和父组件v-slot后的值相同(具名标签)。父组件等于号后面的这个todo使用了解构赋值。

下面将每个todo标号区分,标号相同的todo意味着需要是一样的值。

filterTodos中取出todo3将其绑定在todo2上传递给父组件,父组件通过解构赋值获取了todo2中的内容来使用。

父 : v-slot:todo1="{ todo2 }"
 子 :  <li v-for="todo3 in filteredTodos" v-bind:key="todo3.id">
        <slot name="todo1" :todo2="todo3">