使用v-for渲染一个复用的组件

本文展示了如何在Vue.js中使用v-for指令结合ScopedSlots来渲染可复用组件。在todo-item组件中声明todo属性作为prop接收数据,然后在父组件(parent.vue)中通过v-for遍历数据并利用插槽将每个todo对象传给子组件,显示todo的文本内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要使用 v-for 渲染一个复用的组件,我们需要在组件中使用聚合插槽(Scoped Slots)来接收 v-for 循环的数据。聚合插槽允许组件暴露出一个或多个插槽供父组件动态地填充内容。

以下是一个示例,它展示如何使用 v-for 渲染一个名为 todo-item 的组件:

  • 首先,我们需要在 todo-item 组件中声明一个名为 todo 的 props,该 props 用于接收 v-for 循环的数据。
<!-- todo-item.vue -->
<template>
  <div class="todo-item">
    <!-- 使用聚合插槽来接收父组件动态填充的内容 -->
    <slot :todo="todo"></slot>
  </div>
</template>

<script>
export default {
  name: "todo-item",
  props: {
    todo: {
      type: Object,
      required: true
    }
  }
};
</script>
  • 接下来,我们在父组件中使用 v-for 循环来渲染 todo-item 组件,并通过插槽向 todo-item 传递数据。
<!-- parent.vue -->
<template>
  <div class="todo-list">
    <todo-item v-for="(todo, index) in todos" :key="index">
      <!-- 使用插槽向组件传递数据 -->
      <template v-slot="{ todo }">
        {{ todo.text }}
      </template>
    </todo-item>
  </div>
</template>

<script>
import TodoItem from './todo-item.vue';

export default {
  name: "parent",
  components: {
    TodoItem
  },
  data() {
    return {
      todos: [
        { text: "Learn Vue" },
        { text: "Build an app" },
        { text: "Deploy to production" }
      ]
    };
  }
};
</script>;

在这个示例中,parent 组件通过 v-for 循环遍历 todos 数组中的每个项,并为每个项创建一个 todo-item 组件实例。通过 <template v-slot=“{ todo }”> 声明的插槽,我们将 todo 对象传递给了 todo-item 组件,以供它自己的模板使用。

在 todo-item 组件中,我们声明了一个聚合插槽:<slot :todo=“todo”></slot>。这个插槽接收了 todo 对象,并将它传递给了父组件填充的具名插槽。

父组件传递给 todo-item 组件的数据可以在插槽模板中使用。在上述示例中,我们通过 {{ todo.text }} 显示了 todo 对象中的文本内容。

Vue中,`v-slot`(也称为“插槽”)和`v-for`结合使用是为了动态地生成内容并将其插入到其他组件模板的特定位置。这种组合通常在父子组件通信、复用组件的部分结构以及自定义指令等场景中非常常见。 举个例子,假设我们有这样一个组件`ParentComponent`,它包含一个`slot`区域,我们想根据`childItems`数组的内容来自适应性地显示多个子组件`ChildComponent`: ```html <template> <div> <h2>自定义显示区</h2> <div class="custom-container"> <!-- 使用v-for渲染子组件并传递动态slot --> <ChildComponent v-for="item in childItems" :key="item.id" v-slot="{ item }"> <template #default>{{ item.content }}</template> </ChildComponent> </div> </div> </template> <script> export default { components: { ChildComponent, }, data() { return { childItems: [ { id: 1, content: 'Content 1' }, { id: 2, content: 'Content 2' }, { id: 3, content: 'Content 3' } ] }; } }; </script> ``` 在这个案例中: - `v-for="item in childItems"`将数组里的每个对象作为一次循环迭代,`item`是当前的对象实例。 - `v-slot="{ item }"`接收了一个名为`item`的对象作为插槽的局部变量。 - `<template #default>{{ item.content }}</template>`这部分被称为默认插槽,它是每个子组件实例中的默认内容展示区域,`{{ item.content }}`会渲染子组件传入的`content`属性。 这样,每次循环,`ChildComponent`都会根据`item.content`的内容填充到父组件的`custom-container`内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值