Vue 提供了一个非常强大的特性,叫做插槽 (slots),它允许我们定义组件模板的一部分,然后在父组件中进行填充。这为组件间的内容分发提供了极大的灵活性。在本文中,我们将通过一个简单的例子来探讨 Vue 的插槽功能。
1. 基础插槽
在 Vue 中,我们可以使用 <slot></slot>
标签在组件模板中定义一个插槽。这个插槽可以被父组件中的内容替换。
2. 具名插槽
除了默认插槽,Vue 还支持具名插槽。这允许我们在组件模板中定义多个插槽,并在父组件中为每个插槽提供不同的内容。
3. 示例讲解
考虑以下两个组件:App.vue
和 FancyList.vue
。
App.vue
<script setup> import FancyList from './FancyList.vue' </script> <template> <FancyList :api-url="url" :per-page="10"> <template #item="{ body, username, likes }"> <div class="item"> <p>{{ body }}</p> <p class="meta">by {{ username }} | {{ likes }} likes</p> </div> </template> </FancyList> </template> <style scoped> .meta { font-size: 0.8em; color: #42b883; } </style>
在 App.vue
中,我们导入了 FancyList
组件,并在模板中使用它。我们为 FancyList
组件提供了一个具名插槽 item
,该插槽用于渲染列表中的每一项。
FancyList.vue
<script setup> import { ref } from 'vue' const props = defineProps(['api-url', 'per-page']) const items = ref([]) // mock remote data fetching setTimeout(() => { items.value = [ { body: 'Scoped Slots Guide', username: 'Evan You', likes: 20 }, { body: 'Vue Tutorial', username: 'Natalia Tepluhina', likes: 10 } ] }, 1000) </script> <template> <ul> <li v-if="!items.length"> Loading... </li> <li v-for="item in items"> <slot name="item" v-bind="item"/> </li> </ul> </template> <style scoped> ul { list-style-type: none; padding: 5px; background: linear-gradient(315deg, #42d392 25%, #647eff); } li { padding: 5px 20px; margin: 10px; background: #fff; } </style>
在 FancyList.vue
中,我们定义了一个名为 item
的具名插槽。这个插槽将被 App.vue
中的内容替换。
总结
Vue 的插槽功能为组件间的内容分发提供了极大的灵活性。通过使用默认插槽和具名插槽,我们可以轻松地在父组件中定义和覆盖子组件的内容。
希望这篇博客能帮助你更好地理解 Vue 的插槽功能!
Comments NOTHING