Vue标准插槽和作用域插槽区别与用法详解

news2024/11/15 15:41:55

文章目录

    • 1. 标准插槽(Standard Slots)
    • 2. 作用域插槽(Scoped Slots)
    • 3.标准插槽Vs作用域插槽
    • 4.作用域插槽高级用法
      • 1. 作用域插槽中的默认值
      • 2. 作用域插槽的多个插槽
      • 3. 作用域插槽的动态插槽名
      • 4. 作用域插槽中的函数传递
    • 5.作用域插槽使用场景

在这里插入图片描述

✍创作者:全栈弄潮儿
🏡 个人主页: 全栈弄潮儿的个人主页
🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区
📙 专栏地址:vue2进阶

Vue.js中有两种主要类型的插槽:标准插槽和作用域插槽(Scoped Slots)。它们用于在父组件中将内容传递给子组件,并有不同的用法和功能。

1. 标准插槽(Standard Slots)

标准插槽是Vue.js中的插槽机制的基本形式。通过标准插槽,父组件可以将内容传递给子组件,并在子组件中插入这些内容。标准插槽通常用于静态内容的传递。

示例:

<!-- ParentComponent.vue -->
<template>
  <child-component>
    <p>这是插槽内容</p>
  </child-component>
</template>
<!-- ChildComponent.vue -->
<template>
  <div>
    <slot></slot>
  </div>
</template>

在上面的示例中,子组件使用<slot></slot>来插入父组件传递的内容。

2. 作用域插槽(Scoped Slots)

作用域插槽是Vue.js的高级插槽机制,允许父组件将数据传递给子组件,同时在子组件中自定义渲染这些数据。作用域插槽通常用于需要动态渲染的内容以及子组件需要访问来自父组件的数据的情况。

示例:

<!-- ParentComponent.vue -->
<template>
  <child-component>
    <template v-slot:default="slotProps">
      <p>{{ slotProps.message }}</p>
    </template>
  </child-component>
</template>
<!-- ChildComponent.vue -->
<template>
  <div>
    <slot :message="dataFromParent"></slot>
  </div>
</template>

在上面的示例中,父组件传递了一个名为message的数据给子组件,并子组件使用v-slot来接收这个数据并自定义渲染。

3.标准插槽Vs作用域插槽

  • 标准插槽用于将静态内容传递给子组件,子组件不会对内容进行修改或访问数据。
  • 作用域插槽用于动态渲染内容,父组件可以向子组件传递数据,并子组件可以自定义渲染数据。
  • 作用域插槽是标准插槽的进阶形式,用于更高级的组件交互和自定义渲染。

4.作用域插槽高级用法

作用域插槽(Scoped Slots)具有丰富的高级用法,它们可以用于更复杂的组件交互和数据传递。以下是一些高级用法和示例:

1. 作用域插槽中的默认值

你可以为作用域插槽中的数据提供默认值,以处理可能不存在的数据。示例:

<!-- ParentComponent.vue -->
<template>
  <child-component>
    <template v-slot:default="slotProps">
      <p>{{ slotProps.message || 'No message provided' }}</p>
    </template>
  </child-component>
</template>
<!-- ChildComponent.vue -->
<template>
  <div>
    <slot :message="dataFromParent"></slot>
  </div>
</template>

这样,如果父组件未提供message属性,作用域插槽中将显示默认消息。

2. 作用域插槽的多个插槽

你可以在子组件中定义多个具名插槽,以允许父组件在插槽中传递不同的模板。示例:

<!-- ParentComponent.vue -->
<template>
  <child-component>
    <template v-slot:header="headerSlotProps">
      <h1>{{ headerSlotProps.title }}</h1>
    </template>
    <template v-slot:content="contentSlotProps">
      <p>{{ contentSlotProps.message }}</p>
    </template>
  </child-component>
</template>
<!-- ChildComponent.vue -->
<template>
  <div>
    <slot name="header" :title="headerData"></slot>
    <slot name="content" :message="contentData"></slot>
  </div>
</template>

子组件允许父组件在两个不同的插槽中传递数据和模板。

3. 作用域插槽的动态插槽名

你可以使用动态的插槽名,以根据父组件的条件选择不同的插槽。示例:

<!-- ParentComponent.vue -->
<template>
  <child-component>
    <template v-slot:[slotName]="slotProps">
      <p>{{ slotProps.message }}</p>
    </template>
  </child-component>
</template>
<!-- ChildComponent.vue -->
<template>
  <div>
    <slot :name="slotName" :message="dataFromParent"></slot>
  </div>
</template>

父组件可以通过slotName属性指定要使用的插槽。

4. 作用域插槽中的函数传递

你可以将函数传递给作用域插槽,使父组件能够调用子组件中的函数。示例:

<!-- ParentComponent.vue -->
<template>
  <child-component>
    <template v-slot:default="slotProps">
      <button @click="slotProps.onButtonClick">Click me</button>
    </template>
  </child-component>
</template>
<!-- ChildComponent.vue -->
<template>
  <div>
    <slot :onButtonClick="handleButtonClick"></slot>
  </div>
</template>
<script>
export default {
  methods: {
    handleButtonClick() {
      // 执行某些操作
    }
  }
}
</script>

父组件可以通过onButtonClick属性调用子组件中的函数。

这些高级用法扩展了作用域插槽的强大功能,允许你构建更具动态性和可配置性的组件,使父子组件之间的通信更加灵活。

5.作用域插槽使用场景

作用域插槽(Scoped Slots)适用于多种使用场景,它们提供了更高级的组件交互和数据传递。以下是一些使用作用域插槽的常见场景:

  1. 可配置组件:作用域插槽允许父组件自定义子组件的渲染,这在构建通用组件库或可配置的UI组件时非常有用。例如,你可以创建一个通用的模态框组件,允许父组件决定模态框的标题、内容和按钮。

  2. 数据传递:父组件可以通过作用域插槽向子组件传递数据,这在复杂的数据传递场景中非常有用。例如,你可以将父组件中的数据传递给子组件以动态渲染内容。

  3. 表格和列表:作用域插槽可用于渲染表格、列表和其他重复结构,使父组件能够控制每个单元格或项的内容和格式。

  4. 动态组件:作用域插槽可用于动态组件,允许父组件根据条件或路由来选择要渲染的组件。

  5. 可复用组件:你可以创建通用的渲染组件,允许父组件为子组件传递模板和数据,从而提高组件的可复用性。

  6. 动态表单元素:作用域插槽可用于创建自定义的表单元素,如复杂的选择框、日期选择器和自定义输入控件。

  7. 自定义UI组件:通过作用域插槽,你可以将一些通用的UI组件的渲染逻辑放在子组件中,然后通过插槽向子组件传递不同的UI样式和内容。

  8. 组件通信:作用域插槽可用于实现组件之间的通信,父组件可以向子组件传递回调函数,以便子组件触发特定的操作。

总的来说,作用域插槽适用于需要更高级组件交互和自定义渲染的情况。它们允许你构建更具灵活性和可配置性的组件,从而提高了代码的可维护性和可复用性。然而,在一些简单的情况下,使用插槽或模板语法可能更加直接和方便。所以,选择使用作用域插槽应该根据具体的需求来决定。


✍创作不易,求关注😄,点赞👍,收藏⭐️

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

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

相关文章

王道p149 3.编写后序遍历二叉树的非递归算法(c语言代码实现)

本题代码如下 void postorder(tree* t) {struct treenode* stack[100];//初始化结构体数组int top -1;//让栈顶指向-1treenode* p *t;while (p || top ! -1)//p不为空&#xff0c;并且栈不为空{if (p){top;//p不为空&#xff0c;将p压入栈中stack[top] p;p p->lchild;/…

thinkphp6项目使用多应用开发

使用composer安装项目&#xff0c;命令&#xff1a;composer create-project topthink/think thinkphp6使用多应用开发&#xff0c;安装多应用扩展&#xff0c;命令&#xff1a;composer require topthink/think-multi-app安装多应用扩展成功后&#xff0c;删除app/controller文…

编译报错 internal compiler error: Segmentation fault 解决方法

问题描述 最近在使用虚拟机 ubuntu 20.04 编译 musl gcc 工具链时&#xff0c;遇到一个奇怪的问题&#xff0c;编译过程中异常退出&#xff0c;清理了多次重新编译&#xff0c;发现编译报错提示的信息是 internal compiler error: Segmentation fault 由于之前是可以正常编译的…

java 接口返回乱码 接口中文返回乱码 请求接口返回\u5317\u4eac乱码 okhttp请求返回中文乱码

1. 对接第三方请求&#xff0c;返回参数中文乱码&#xff0c;如下图所示。 2. 原因&#xff1a;中文被unicode编码导致。okhttp设置返回编码格式也不生效&#xff1a; // String result new String(response.body().bytes(), "utf-8");3. 解决方案&…

JS三种常见的存储机制

1.localStorage localStorage是HTML5引入的一种持久化存储机制&#xff0c;用于在浏览器中长期保存数据。localStorage中存储的数据没有过期时间&#xff0c;除非被显式清除或代码删除。存储在localStorage中的数据对于同一个域名下的所有页面都是共享的。localStorage可以存储…

香港优才计划线上申请官网入口地址在此,附自己申请攻略!

香港优才计划线上申请官网入口地址在此&#xff0c;附自己申请攻略&#xff01; 2023年4月份开始&#xff0c;香港入境处调整了优才计划申请方式。申请人须使用电子化服务递交有关申请&#xff0c;也就是线上申请&#xff01;入境处不再接受亲身递交、以邮递或投递方式递交的有…

腾讯云抱歉不满足产品首购条件解决方法

购买腾讯云服务器提示“抱歉&#xff0c;检测到相同实名认证主体已购买&#xff0c;不满足产品首购条件&#xff0c;您可了解其他商品。”&#xff0c;购买腾讯云特价云服务器是有新用户首购限制的&#xff0c;说当前腾讯云认证主体的其他账号已经购买过云服务器&#xff0c;一…

WAS项目更新单个文件

WAS项目更新单个文件 websphere替换单个文件时&#xff0c;相对路径是ear目录作为根路径 ‍ ‍ 比如要替换zjyct_testgkjz.jsp,路径只要填写BocGkjzWeb.war/zjyct_testgkjz.jsp&#xff0c;如果填写绝对路径&#xff0c;将造成如上图find出来的第一条所示结果问题 ‍

什么是有效种草!900万播放成B站“网红品牌”

- 导语 众所周知&#xff0c;B站早期是二次元小众社区&#xff0c;所以ACG&#xff08;动画、漫画、游戏三者的合称&#xff09;内容一直是B站的核心品类&#xff0c;B站经过多品类内容的摸索和发展&#xff0c;一直到现在成为年轻一代聚集的多元化社区&#xff0c;但ACG内容仍…

C++宏的作用

四种预编译命令:头文件包含&#xff0c;条件编译&#xff0c;宏替换和布局控制。 1.头文件包含 #include 文件分别用两种形式包含&#xff0c;一种将文件用“”包含&#xff0c;另一种用<>包含。 两种包含方式的不同之处在于&#xff0c;它们的查找策略不同。 #incl…

【递归、搜索与回溯算法】第五节.129. 求根节点到叶节点数字之和和814. 二叉树剪枝

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;递归、搜索与回溯算法 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&am…

基于Java的医药进销存管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

CMake 坑之添加文件后不修改CMakeList.txt,则文件加不进来

问题&#xff1a; 我在一个文件夹中加了一个.h和对应的cpp。 这里.h中的类会被导出。 但是怎么都导不出来。 我试了无数次的 clean and rebuild 都没用。 分析&#xff1a; 做了很多实验。发现是新建的文件没有被读取进来。 解决方法&#xff1a; 改进了下对应的CMakeL…

嵌入式软件工程师面试题——2025校招专题(三)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

Ubuntu 安装 docker-compose

在Ubuntu上安装Docker Compose&#xff0c;可以按照以下步骤进行操作&#xff1a; 下载 Docker Compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker…

【static + 代码块+toString打印对象】

文章目录 static成员static修饰成员变量static成员变量初始化代码块 对象的打印写show方法打印对象调用toString打印对象 总结 static成员 举例&#xff1a;一个班的学生&#xff0c;在实例化每个人的名字&#xff0c;年龄&#xff0c;学号等学员信息时都不一样&#xff0c;但…

Redis单线程还是多线程?

&#x1f603; 个人学习笔记&#xff0c;不喜勿喷&#xff0c;望大佬指正&#xff01; 目录 一、Redis为什么选择单线程1. 是什么&#xff1f;2. why&#xff0c;为什么之前选择单线程&#xff1f;3. 作者原话使用单线程原因&#xff0c;官网证据 二、 为什么逐渐加入多线程特性…

网络安全,下一个十年饭碗稳了!

“战役”阶段&#xff0c;多个行业线下转为线上求生&#xff0c;云买菜、云蹦迪、云相亲、云聚会悄然兴起&#xff0c;未来属于云时代似乎成为互联网的共识&#xff0c;而与互联网息息相关的网络安全领域&#xff0c;已经站上了了蓬勃发展的“风口” 如今&#xff0c;网络安全前…

如何用Postman做接口自动化测试?一文5个步骤带你成功实现!

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用例…

Python超入门(6)__迅速上手操作掌握Python

# 26.函数和参数 # 注意&#xff1a;有参函数和无参函数的名字要不同 def user(): # 无参函数print("hello world!")def user1(my_id): # 有参函数print(my_id)def user2(first_name, last_name): # 有参函数print(fMy name is {first_name} {last_name})print(&…