1. 基本概念
在 Vue 中, slot 用于定义组件中的插槽位置,外部的内容会被插入到组件内部的这个位置。插槽的内容是动态的,可以根据需要进行传递和渲染。它允许开发者在组件外部传递任意内容,并在组件内部进行渲染,主要功能是提高组件的复用性和灵活性。
2. 使用方式
2.1. 默认插槽
最基本的插槽用法是默认插槽,在组件模板中定义 slot,在组件使用时传递内容。
1. 子组件 MyComponent.vue
<template>
<div>
<slot></slot>
</div>
</template>
2. 父组件
<template>
</Component>
<p>This is some content passed to the slot.</p>
</MyComponent>
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
};
</script>
2.2. 具名插槽
有时需要在一个组件中使用多个插槽,这时可以使用命名插槽。
1. 子组件 MyComponent.vue
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot> <!-- 默认插槽 -->
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
2. 父组件
<template>
<MyComponent>
<template v-slot:header>
<h1>Header Content</h1>
</template>
<template v-slot:footer>
<p>Footer Content</p>
</template>
<p>Main Content</p>
</MyComponent>
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
};
</script>
2.3. 作用域插槽
作用域插槽允许子组件将数据传递给插槽内容的父组件,这在需要在插槽内容中使用子组件数据时非常有用。
1. 子组件 MyComponent.vue
<template>
<div>
<slot :user="user"></slot>
</div>
</template>
<script>
export default {
data() {
return {
user: {
name: 'John Doe',
age: 30
}
};
}
};
</script>
2. 父组件
<template>
<MyComponent>
<template v-slot:default="slotProps">
<p>User Name: {{ slotProps.user.name }}</p>
<p>User Age: {{ slotProps.user.age }}</p>
</template>
</MyComponent>
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
};
</script>
3. 使用场景
复用组件结构:插槽允许开发者在不同的上下文中复用相同的组件结构,而改变内容。比如模态框、卡片组件等。
动态内容插入:在一些布局组件中,可以通过插槽动态插入不同的内容,而不需要修改组件本身。
自定义渲染逻辑:在复杂组件中,通过作用域插槽可以将一些数据传递给父组件,从而让父组件来决定如何渲染这些数据。
嵌套组件:在多层嵌套组件中,插槽可以让外层组件将内容传递给内层组件,从而实现复杂的嵌套布局。