Vue组件:插槽的使用

news2024/11/26 20:55:22

在实际开发中,子组件往往只提供基本的交互功能,而内容是有父组件来提供的。为此,Vue.js 提供了一种混合父组件内容和子组件模板的方式,这种方式称为内容分发。

1、基本用法

Vue.js 参照当前 Web Components 规范草案实现了一套内容分发的 API,使用 <slot> 元素作为原始内容的插槽。

【实例】插槽的基本用户。

(1)创建 ParentComponent.vue 父组件

<template>
    <fieldset>
        <legend>父组件</legend>
        <h3>父组件内容:插槽的使用</h3>

        <!-- 第三步:使用组件 -->
        <BlogSlot>
            <p>博客信息:{{ blogName }}</p>
            <p>博客信息:{{ blogUrl }}</p>
        </BlogSlot>
    </fieldset>
</template>

<script>
//第一步:引用组件
import BlogSlot from '@/components/BlogSlot.vue'

export default {
    data() {
        return {
            blogName: '您好,欢迎访问 pan_junbiao的博客',
            blogUrl: 'https://blog.csdn.net/pan_junbiao'
        }
    },
    //第二步:注册组件
    components: {
        BlogSlot,
    }
}
</script>

(2)创建 BlogSlot.vue 子组件

<template>
    <fieldset>
        <legend>子组件</legend>
        <!-- 核心代码:使用插槽 -->
        <slot></slot>
    </fieldset>
</template>

<style scoped>
fieldset {
    font-size: 18px;
    color: blue;
}
</style>

(3)在 App.vue 根组件中,引入父组件

<template>
  <!-- 第三步:使用组件 -->
  <ParentComponent />
</template>

<script>
//第一步:引用组件
import ParentComponent from '@/components/ParentComponent.vue'

export default {
  //第二步:注册组件
  components: {
    ParentComponent,
  }
}
</script>

<style></style>

执行结果:

由渲染结果可以看出,父组件中的内容会被代替子组件中的 <slot> 标签,这样就可以在不同地方使用子组件的机构并且填充不同的父组件内容,从而提供组件的复用性。

2、编译作用域

上述实例代码在父组件中调用 <BlogSlot> 子组件,并绑定了父组件中的数据:blogName、blogUrl。其中的数据只能在父组件的作用域下进行解析,而不能在 <BlogSlot> 子组件的作用域下进行解析。也就是说,父组件模板里的所有内容都是在父组件作用域中编译的;子组件模板里的所有内容都是在子组件作用域中编译的。

3、默认内容

有些时候需要为一个插槽设置默认内容,该内容只会在没有提供内容的时候被渲染。

【实例】为插槽设置默认内容。

(1)修改 ParentComponent.vue 父组件,将插槽的内容注释掉

<template>
    <fieldset>
        <legend>父组件</legend>
        <h3>父组件内容:插槽的使用</h3>

        <!-- 第三步:使用组件 -->
        <BlogSlot>
            <!-- 父组件中,将插槽的内容注释掉 -->
            <!-- <p>博客信息:{{ blogName }}</p> -->
            <!-- <p>博客信息:{{ blogUrl }}</p> -->
        </BlogSlot>
    </fieldset>
</template>

(2)修改 BlogSlot.vue 子组件,为插槽设置默认内容

<template>
    <fieldset>
        <legend>子组件</legend>
        <!-- 核心代码:使用插槽,并设置默认内容 -->
        <slot>默认内容</slot>
    </fieldset>
</template>

执行结果:

4、命名插槽

如果要在组件模板中使用多个插槽,就需要到 <slot> 标签的 name 属性。通过这个属性可以为插槽命令。在向命令的插槽提供内容时,可以在一个 <template> 元素上使用 v-slot 指令,将插槽的名称作为 v-slot 指令的参数。这样,<template> 元素中的所有内容都将被传入相应的插槽。

【实例】使用命名插槽。

(1)修改 ParentComponent.vue 父组件

<template>
    <fieldset>
        <legend>父组件</legend>
        <h3>父组件内容:插槽的使用</h3>

        <!-- 第三步:使用组件 -->
        <BlogSlot>
            <!-- v-slot指令的参数需要与子组件中的slot元素的name值匹配 -->
            <template v-slot:blogName>
                <h3>插槽内容1:{{ blogName }}</h3>
            </template>

            <template v-slot:blogUrl>
                <h4>插槽内容2:{{ blogUrl }}</h4>
            </template>
        </BlogSlot>
    </fieldset>
</template>

<script>
//第一步:引用组件
import BlogSlot from '@/components/BlogSlot.vue'

export default {
    data() {
        return {
            blogName: '您好,欢迎访问 pan_junbiao的博客',
            blogUrl: 'https://blog.csdn.net/pan_junbiao'
        }
    },
    //第二步:注册组件
    components: {
        BlogSlot,
    }
}
</script>

(2)修改 BlogSlot.vue 子组件

<template>
    <fieldset>
        <legend>子组件</legend>
        <!-- 核心代码:使用插槽 -->
        <slot name="blogName"></slot>
        <hr>
        <slot name="blogUrl"></slot>
    </fieldset>
</template>

<style scoped>
fieldset {
    font-size: 18px;
    color: blue;
}
</style>

执行结果:

5、作用域插槽

有些时候需要让插槽内容能够访问子组件中才有的数据。为了让子组件中的数据在父组件的插槽内容中可用,可以将子组件中的数据作为一个 <slot> 标签的属性并对其进行绑定。绑定在 <slot> 标签上的属性被称为插槽 Prop。然后在父组件作用域中,可以为 v-slot 设置包含所有插槽 Prop 的对象的名称。

【实例】单个插槽时,使用作用域插槽。

(1)修改 ParentComponent.vue 父组件

<template>
    <fieldset>
        <legend>父组件</legend>
        <h3>父组件内容:插槽的使用</h3>

        <!-- 第三步:使用组件 -->
        <BlogSlot v-slot="slotProps">
            <p>用户名称:{{ slotProps.userName }}</p>
            <p>用户年龄:{{ slotProps.age }}</p>
            <p>用户性别:{{ slotProps.sex }}</p>
            <p>博客信息:{{ slotProps.blogName }}</p>
            <p>博客信息:{{ slotProps.blogUrl }}</p>
        </BlogSlot>
    </fieldset>
</template>

<script>
//第一步:引用组件
import BlogSlot from '@/components/BlogSlot.vue'

export default {
    //第二步:注册组件
    components: {
        BlogSlot,
    }
}
</script>

(2)修改 BlogSlot.vue 子组件

<template>
    <fieldset>
        <legend>子组件</legend>
        <!-- 核心代码:使用插槽 -->
        <slot :userName="userName" :age="age" :sex="sex" :blogName="blogName" :blogUrl="blogUrl"></slot>
    </fieldset>
</template>

<script>
export default {
    data() {
        return {
            userName: 'pan_junbiao的博客',
            age: 36,
            sex: '男',
            blogName: '您好,欢迎访问 pan_junbiao的博客',
            blogUrl: 'https://blog.csdn.net/pan_junbiao'
        }
    }
}
</script>

<style scoped>
fieldset {
    font-size: 18px;
    color: blue;
}
</style>

执行结果:

上述代码中,将子组件中的数据 userName、age、sex、blogName、blogUrl 作为 <slot> 标签绑定的属性,然后在父组件作用域中,为 v-slot 设置的包含所有插槽 Prop 的对象的名称为 slotProps,在通过 {{ slotProps.userName }}、{{ slotProps.age }} 等即可访问子组件中的数据。

【实例】多个插槽时(命名插槽),使用作用域插槽。

(1)修改 ParentComponent.vue 父组件

<template>
    <fieldset>
        <legend>父组件</legend>
        <h3>父组件内容:插槽的使用</h3>

        <!-- 第三步:使用组件 -->
        <BlogSlot>
            <!-- v-slot指令的参数需要与子组件中的slot元素的name值匹配 -->
            <template v-slot:userInfo="slotProps">
                <p>用户名称:{{ slotProps.userName }}</p>
                <p>用户年龄:{{ slotProps.age }}</p>
                <p>用户性别:{{ slotProps.sex }}</p>
            </template>

            <template v-slot:blogInfo="slotProps">
                <p>博客信息:{{ slotProps.blogName }}</p>
                <p>博客信息:{{ slotProps.blogUrl }}</p>
            </template>
        </BlogSlot>
    </fieldset>
</template>

<script>
//第一步:引用组件
import BlogSlot from '@/components/BlogSlot.vue'

export default {
    //第二步:注册组件
    components: {
        BlogSlot,
    }
}
</script>

(2)修改 BlogSlot.vue 子组件

<template>
    <fieldset>
        <legend>子组件</legend>
        <!-- 核心代码:使用插槽 -->
        <slot name="userInfo" :userName="userName" :age="age" :sex="sex"></slot>
        <hr>
        <slot name="blogInfo" :blogName="blogName" :blogUrl="blogUrl"></slot>
    </fieldset>
</template>

<script>
export default {
    data() {
        return {
            userName: 'pan_junbiao的博客',
            age: 36,
            sex: '男',
            blogName: '您好,欢迎访问 pan_junbiao的博客',
            blogUrl: 'https://blog.csdn.net/pan_junbiao'
        }
    }
}
</script>

<style scoped>
fieldset {
    font-size: 18px;
    color: blue;
}
</style>

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

和 InternLM 解锁“谁是卧底”新玩法

本文来自社区投稿&#xff0c;作者LangGPT联合发起人、东北大学在读博士生王明 在大模型技术日益普及的今天&#xff0c;AI 的应用已经渗透到各个领域&#xff0c;带来了无数创新和乐趣。今天&#xff0c;我们将一起探索如何搭建一个 AI 版的“谁是卧底”游戏。通过 InternStud…

【Unity基础】Input中GetAxis和GetAxisRaw的区别

一句话描述&#xff1a;GetAxis使用了平滑过渡&#xff0c;而GetAxisRaw是直接改变。 在Unity中&#xff0c;Input.GetAxisRaw 和 Input.GetAxis 都用于获取输入设备的轴向输入&#xff08;例如键盘、鼠标或手柄的摇杆&#xff09;&#xff0c;但它们的工作方式和返回值有细微…

GPU 服务器性能评估:多维度深度探索

在深度学习的浩瀚宇宙中&#xff0c;GPU 服务器犹如一颗璀璨的星辰&#xff0c;以其无与伦比的计算能力和效率引领着技术进步的浪潮。为了充分挖掘这一强大工具的潜力&#xff0c;我们需深入探寻其性能评估的奥秘&#xff0c;这不仅仅是对单一指标的简单堆砌&#xff0c;而是从…

从虚拟现实到元宇宙:Facebook引领未来社交的下一步

随着科技的迅猛发展&#xff0c;社交媒体正在经历一场深刻的变革。从最初的文本和图片交流&#xff0c;到如今的沉浸式虚拟现实&#xff08;VR&#xff09;和即将到来的元宇宙&#xff0c;社交互动的方式正在发生根本性的变化。作为行业领军者&#xff0c;Facebook&#xff08;…

3GPP协议入门——物理层基础(一)

1. 频段/带宽 NR指定了两个频率范围&#xff0c;FR1&#xff1a;通常称Sub 6GHz&#xff0c;也称低频5G&#xff1b;FR2&#xff1a;通常称毫米波&#xff08;Millimeter Wave&#xff09;&#xff0c;也称高频5G。 2. 子载波间隔 NR中有15kHz&#xff0c;30kHz&#xff0c;6…

数据库类型有哪些?

根据存储方式的不同&#xff0c;数据库可以分为不同种类。每种类型的数据库&#xff0c;都有各自使用场景以及不同的产品。 ​ 关系型数据库 关系型数据库&#xff08;RDBMS&#xff09;基于关系模型&#xff0c;通过表&#xff08;Table&#xff09;的形式来组织数据&#xf…

利士策分享,如何规划多彩的大学生活?

利士策分享&#xff0c;学习规划多彩的大学生活 踏入大学&#xff0c;如同开启一场充满未知与可能的旅程。 为了让这段旅程不仅充满学术的熏陶&#xff0c;还洋溢着生活的多彩与人际的和谐&#xff0c;我们需要精心规划&#xff0c;积极行动。 一、多彩规划&#xff1a;点亮大学…

双指针的运用

一、双指针 双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 1.1 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff…

一文揭秘:从零开发一套中小型医院的云HIS系统,需要多少开发成本?

从零开发一套中小型的云HIS&#xff08;医院信息系统&#xff09;系统&#xff0c;首先要组建团队&#xff0c;包括招聘、培训、设备购置&#xff0c;然后要经历需求分析、系统设计、编码、测试等多个阶段&#xff0c;这会消耗大量的时间&#xff0c;其开发成本会受到多种因素的…

《凡人歌》重塑现实主义爆款,正午阳光终于“杀”回来了

2024年的现实主义爆款&#xff0c;出自正午阳光之手。 今年剧集市场一个明显的变化在于&#xff0c;最贴近时代生活、最有“爆款潜质”的现实主义题材电视剧的缺位。根据云合数据&#xff0c;截止到2024年9月&#xff0c;年榜前十中没有一部现实主义大剧&#xff0c;古装剧却多…

在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

目录 在线编程实现&#xff01;如何在Java后端通过DockerClient操作Docker生成python环境 一、为什么要用后端程序操作Docker 二、安装Docker 1、安装Docker 2、启动Docker 三、DockerClient与CMD操作Docker的区别 四、干货&#xff01;如何使用DockerClient实现在线编程…

通过信息架构提升商业智能:实现数据驱动创新的策略与方法

拥抱数据驱动时代 在当前的数字化转型浪潮中&#xff0c;数据已成为企业最重要的资产之一。全球范围内的网络巨头通过精细的数据管理和分析&#xff0c;已成功颠覆了传统行业。这些企业的成功不仅源于他们掌握了大量数据&#xff0c;还因为他们能有效地利用这些数据来做出精准…

研一小白读论文记录,计算机视觉,Transformer

论文是IEEE收录的一篇论文《CrossFormer: A Versatile Vision Transformer Hinging on Cross-Scale Attention》&#xff08;《基于跨尺度自注意力机制的多功能视觉Transformer》&#xff09; 泛读完之后最大的感悟有以下几点&#xff1a; 1、文章在实验的结果中呈现了大量的…

Getty Images推AI训练样本:3750张高质量照片免费开放

近日&#xff0c;全球领先的商业图库Getty Images发布了一项重大决策&#xff0c;宣布将为AI开发者提供一份包含3750张高分辨率照片的免费训练数据集。这份详尽的数据集覆盖了商业、教育、医疗健康、运动健身、物品物体、插图图标等15个不同领域&#xff0c;目的在于助力AI技术…

unity UGUI高性能飘字解决方案(对象池+合并网格)

本方案仅供参考 从需求出发 游戏类型&#xff1a;微信小游戏 帧数限定&#xff1a;60 已知的几种方案&#xff1a; 1:场上只存在一个mesh&#xff0c;每帧把所有字绘制到一个mesh。 优点&#xff1a;每帧都重绘&#xff0c;高度定制化&#xff0c;可以随意添加、删除。 …

HTTP状态码解析:在Haskell中判断响应成功与否

在互联网的世界里&#xff0c;HTTP状态码是服务器与客户端之间通信的一种语言。它们告诉我们请求是否成功&#xff0c;或者遇到了什么问题。在进行网络编程时&#xff0c;正确地解析和处理这些状态码是至关重要的。本文将探讨HTTP状态码的基本概念&#xff0c;并展示如何在Hask…

KUKA中级学习4:修改软件中机器人名字,纠正示教器时间,下载备份文件进示教器

这里写目录标题 一、修改机器人名字1.1、程序安装下载二、示教器时间修改2.1、时间修改&#xff0c;示教器全英文显示三、下载备份文件 一、修改机器人名字 1.1、程序安装下载 选下面这个 二、示教器时间修改 2.1、时间修改&#xff0c;示教器全英文显示 三、下载备份文件 …

FancyVideo环境搭建推理

引子 很少关注360开源的代码&#xff0c;最近360AI团队开源了最新视频模型FancyVideo&#xff0c;据说RTX3090可跑。可以在消费级显卡 (如 GeForce RTX 3090) 上生成任意分辨率、任意宽高比、不同风格、不同运动幅度的视频&#xff0c;其衍生模型还能够完成视频扩展、视频回溯…

springboot+vue+mybatis计算机毕业设计网上购物系统+PPT+论文+讲解+售后

本文首先实现了网上购物系统设计与实现管理技术的发展随后依照传统的软件开发流程&#xff0c;最先为系统挑选适用的言语和软件开发平台&#xff0c;依据需求分析开展控制模块制做和数据库查询构造设计&#xff0c;随后依据系统整体功能模块的设计&#xff0c;制作系统的功能模…

《JavaEE进阶》----13.<Spring Boot【配置文件】>

本篇博客讲解 1.SpringBoot配置文件的格式以及对应的语法 2.了解两个配置文件格式的差异、优缺点。 我们这里只做简单的介绍。看会&#xff0c;了解&#xff0c;学会读取就行了。 因为配置文件实在太多了&#xff0c;这里只做基础的介绍。 一、配置文件的作用 前言 计算机中有许…