vue中的插槽是什么,官方解释是:
Vue 实现了一套内容分发的 API,这套 API 的设计灵感源自 Web Components 规范草案,将 <slot>
元素作为承载分发内容的出口…
vue2插槽和vue3插槽基本概念是一致的,也是匿名插槽、具名插槽、作用域插槽三种,只是基础语法有一些区别。
下面让我们温习一下插槽的常用基础知识点。
匿名插槽
Vue2案例:
<!-- 子组件 child-component -->
<template> <div> <slot></slot> </div>
</template> <!-- 父组件使用匿名插槽组件 child-component -->
<template> <child-component> <p>这是默认插槽的内容哈哈哈</p> </child-component>
</template>
Vue3案例:
<!-- 子组件child-component -->
<template> <div> <slot></slot> </div>
</template> <!-- 父组件使用插槽组件 child-component -->
<template> <child-component> <template v-slot> <p>这是默认插槽的内容hello world</p> </template> </child-component>
</template>
具名插槽
Vue2案例:
<!-- 子插槽组件child-component -->
<template> <div> <slot name="header"></slot> <slot name="content"></slot> <slot name="footer"></slot> </div>
</template><!-- 父组件使用插槽组件child-component -->
<template> <child-component> <template slot="header"> <h1>这是header部分</h1> </template> <template slot="content"> <p>这是content</p> </template> <template slot="footer"> <p>这是footer</p> </template> </child-component>
</template>
Vue3案例:
<!-- 子插槽组件child-component -->
<template> <div> <slot name="header"></slot> <slot name="content"></slot> </div>
</template> <!-- 父组件使用插槽组件 -->
<template> <child-component> <template v-slot:header> <h1>这是header</h1> </template> <template v-slot:content> <p>这是content</p> </template> </child-component>
</template>
作用域插槽
作用域插槽日常可能使用的很少,但是某些场景用起来还是很方便的。可以简单的理解为 作用域插槽允许父组件访问子组件内部的数据,并基于这些数据渲染内容。
Vue2案例:
<!-- 子组件child-component返回给父级组件user数据 -->
<template> <div> <slot :user="user"></slot> </div>
</template> <script>
export default { data() { return { user: { name: '张三000' } } }
}
</script> <!-- 父组件使用child-component ,并获取到子组件返回的 user数据-->
<template> <child-component> <template slot-scope="scope"> <p>用户名:{{ scope.user.name }}</p> <!--张三000--></template> </child-component>
</template>
Vue3案例:
子插槽组件:
<template> <slot :user="user"></slot>
</template>
<script setup>
import { reactive } from "vue";const user = reactive({name: '张三', age: 30
});
</script>
父组件使用子插槽组件:
<template> <div> <child-component> <template v-slot:default="{ user: { name, age } }"><p>姓名: {{ name }}</p> <p>年龄: {{ age }}</p> </template> </child-component> </div>
</template>
<script setup>
import ChildComponent from './ChildComponent.vue';
<script>