插槽与具名插槽以及嵌套插槽的使用

简介: 插槽与具名插槽以及嵌套插槽的使用

本篇文章内容将会讲解到,插槽与具名插槽以及嵌套插槽的使用方法和场景


插槽 < slot />


插槽简单的来说就是将写在父组件里的内容插入到子组件里

需求:在子组件中显示  '这就是插槽' 几个字


使用方法


1.首先在父组件中引用Dialog子组件,并在中间写入内容


//这是父组件里的代码,引入子组件Dialog
<Dialog >
        <h2>这就是插槽</h2>
</Dialog>

2.告诉子组件在那个地方插入,使用

//这是子组件Dialog的内容
<template>
  <p>下面就是插槽插入的位置</p>
     //slot就是插入的地方
   <slot />
</template>

这样的插槽很简单,但是只能插入一个地方,我要是想在不同的地方插入不同的内容,这该怎么办呢?这就该使用具名插槽


具名插槽


具名插槽就是带有名字的插槽,一个名字一个坑

需求:将标题插入到header里,将内容插入到main里


使用方法


1.在父组件将不同的内容使用template包裹,并使用v-slot起一个名字

<Dialog >
    <template v-slot:title>
        <h2>具名插槽</h2>
    </template>
    <template v-slot:content>
        <p>第一行</p>
        <p>第八行</p>
    </template>
</Dialog>

v-slot可以使用#代替,效果是一样的

<Dialog >
    <template #title>
        <h2>具名插槽</h2>
    </template>
    <template #content>
        <p>第一行</p>
        <p>第八行</p>
    </template>
</Dialog>

2.在子组件将插槽使用名字匹配

<template>
    <div class="gulu-dialog">
        <header>
            <slot name="title" />
        </header>
        <main>
            <slot name="content" />
        </main>
        <footer>
            <Button @click="ok" level="main">OK</Button>
            <Button @click="cancel">Cancel</Button>
        </footer>
    </div>
</template>

嵌套插槽


在父组件里写一个子组件,并且子组件里嵌套着孙子组件,如何将孙子组件的内容也渲染到页面上?

需求:将 导航1 和 内容1 都显示到页面上


父组件的代码

<template>
<div>
    <h1>Tabs组件</h1>
    <Tabs>
        <Tab title="导航1">内容1</Tab>
        <Tab title="导航2">内容2</Tab>
    </Tabs>
</div>
</template>

1.在孙子组件写上插槽

<template>
<div>
    <slot />
</div>
</template>

2.使用context在子组件获取父组件传递的内容,context.slots.default() 可以获取到父组件传递的标签对象结构


  • 可以使用component 在子组件的模板上将内容渲染,但是只能将内容1,内容2显示到页面上。标签里的title内容显示不出来
<component v-for="(c,index) in defaults" :is="c" :key="index" />


  • 使用forEach 或者map可以遍历到标签对象,这样就可以调用里面的属性了 此时titles里面存储的就是标签里的title数组了,
const titles = defaults.map((tag) => {
            return tag.props.title
        })

子组件完整的代码

<template>
<div>
    <div v-for="(t,index) in titles" :key="index">{{t}}</div>
    <component v-for="(c,index) in defaults" :is="c" :key="index" />
</div>
</template>
<script lang="ts">
import Tab from './Tab.vue'
export default {
    setup(props, context) {
    //获取标签对象数组
        const defaults = context.slots.default()
        //这个可以检查传递的组件是否是孙子组件
        defaults.forEach((tag) => {
            if (tag.type !== Tab) {
                throw new Error('Tabs 子标签必须是Tab')
            }
        })
        //获取标签里的title属性数组
        const titles = defaults.map((tag) => {
            return tag.props.title
        })
        return {
            defaults,
            titles
        }
    }
}
</script>

总结


  • 标签对象属性组.type !== Tab可以判断传递过来的孙子组件是不是Tab类型的
  • context.slots.default()可以获取传递的插槽内容
  • component组件可以渲染出传递的标签
  • 在使用 v-for遍历时要使用:key 但是使用index有时可能会出现bug,这个下回再深究


目录
相关文章
|
4月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
735 5
|
10月前
|
Java Android开发
Eclipse 运行配置(Run Configuration)
Eclipse 运行配置(Run Configuration)
306 1
|
5月前
|
JavaScript 前端开发 Unix
|
10月前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
前端开发 容器
CSS【详解】定位 position (静态定位 static -- 文档流排布 、相对定位 relative、绝对定位 absolute、固定定位 fixed、黏性定位 sticky)
CSS【详解】定位 position (静态定位 static -- 文档流排布 、相对定位 relative、绝对定位 absolute、固定定位 fixed、黏性定位 sticky)
887 0
|
JavaScript
VScode格式化vue文件--避免html属性换行
VScode格式化vue文件--避免html属性换行
1342 0
|
前端开发 JavaScript
前端 JS 经典:数字变化动画
前端 JS 经典:数字变化动画
274 0
|
缓存 负载均衡 应用服务中间件
nginx(NGINX)详细下载安装及使用教程
nginx(NGINX)详细下载安装及使用教程
1388 0
|
缓存 JavaScript
巧用 computed 计算属性,实现代码简洁高效
巧用 computed 计算属性,实现代码简洁高效
452 1