当前位置: 首页 > article >正文

【前端】【vue】vue2/3,nuxt的插槽使用详解

插槽在Vue2、Vue3和不同版本Nuxt中的使用

Vue2中的插槽

基础插槽

在Vue2中,基础插槽允许在组件的模板中定义一个占位符,然后在使用组件时插入自定义内容。例如,创建一个简单的MyBox组件:

<template><div class="box"><slot></slot></div>
</template><script>
export default {name: 'MyBox'
}
</script><style scoped>
.box {border: 1px solid #ccc;padding: 10px;
}
</style>

使用时:

<template><div><MyBox><p>这是插入到MyBox组件插槽中的内容</p></MyBox></div>
</template><script>
import MyBox from './MyBox.vue';
export default {components: {MyBox}
}
</script>

基础插槽本身不涉及数据传递,主要用于简单的内容插入。

具名插槽

具名插槽允许在一个组件中定义多个插槽,并通过名称来区分。例如:

<template><div class="layout"><slot name="header"></slot><slot></slot><slot name="footer"></slot></div>
</template><script>
export default {name: 'MyLayout'
}
</script><style scoped>
.layout {display: flex;flex-direction: column;
}
</style>

使用时:

<template><div><MyLayout><template v-slot:header><h1>页面标题</h1></template><p>页面主体内容</p><template v-slot:footer><p>版权所有 &copy; 2024</p></template></MyLayout></div>
</template><script>
import MyLayout from './MyLayout.vue';
export default {components: {MyLayout}
}
</script>

具名插槽同样主要用于内容的组织,通常不直接传递数据,不过可以结合其他Vue特性,如props来间接实现数据相关的展示。

作用域插槽 - 数据传递

作用域插槽允许子组件向插槽传递数据。比如有一个展示用户列表的UserList组件,需要在列表项中展示用户的基本信息和自定义操作:

<template><ul><li v-for="user in users" :key="user.id"><slot :user="user"><span>{{ user.name }} - {{ user.age }}</span></slot></li></ul>
</template><script>
export default {data() {return {users: [{ id: 1, name: '张三', age: 25 },{ id: 2, name: '李四', age: 30 }]};}
}
</script>

使用时:

<template><div><UserList><template v-slot:default="slotProps"><span>{{ slotProps.user.name }} - {{ slotProps.user.age }}</span><button @click="handleClick(slotProps.user)">操作</button></template></UserList></div>
</template><script>
import UserList from './UserList.vue';
export default {components: {UserList},methods: {handleClick(user) {console.log(`对用户${user.name}进行操作`);}}
}
</script>

这里子组件UserList通过slot标签的属性:user="user"将用户数据传递给插槽,父组件在使用插槽时,通过v-slot:default="slotProps"接收数据,slotProps是一个对象,包含了子组件传递过来的user数据。

Vue3中的插槽

Vue3在插槽的使用上基本延续了Vue2的语法,但在一些细节上有所改进。

作用域插槽 - 数据传递

在Vue3中,使用v-slot指令更加简洁。例如,创建一个MyList组件展示商品列表:

<template><ul><li v-for="item in items" :key="item.id"><slot :item="item">{{ item.name }}</slot></li></ul>
</template><script>
export default {data() {return {items: [{ id: 1, name: '苹果', price: 5 },{ id: 2, name: '香蕉', price: 3 }]};}
}
</script>

使用时:

<template><div><MyList><template v-slot="{ item }"><span>{{ item.name }} - 价格: {{ item.price }}</span></template></MyList></div>
</template><script>
import MyList from './MyList.vue';
export default {components: {MyList}
}
</script>

这里v-slot后面接一个对象解构,直接获取子组件传递过来的数据item,相比Vue2更加简洁直观。同时,在Vue3中,还可以使用v-slot配合动态参数,实现更灵活的数据传递和插槽使用。

Nuxt中的插槽

Nuxt2

在Nuxt2中,插槽被广泛应用于页面布局和组件中。例如,在默认的layouts/default.vue中:

<template><div><nuxt-head></nuxt-head><header><slot name="header"></slot></header><main><nuxt></nuxt></main><footer><slot name="footer"></slot></footer></div>
</template>

在页面中使用时:

<template><div><template v-slot:header><h1>我的页面标题</h1></template><p>页面内容</p><template v-slot:footer><p>页面底部信息</p></template></div>
</template>

对于数据传递,Nuxt2可以在页面组件中通过this.$root.$data等方式访问全局数据,然后在插槽内容中展示。例如,在layouts/default.vue中定义一个全局的网站名称数据,在header插槽中展示:

<template><div><nuxt-head></nuxt-head><header><slot name="header">{{ $root.$data.siteName }}</slot></header><main><nuxt></nuxt></main><footer><slot name="footer"></slot></footer></div>
</template><script>
export default {data() {return {siteName: '我的网站'};}
}
</script>

在页面中使用时:

<template><div><template v-slot:header><h1>{{ $root.$data.siteName }} - 页面标题</h1></template><p>页面内容</p><template v-slot:footer><p>页面底部信息</p></template></div>
</template>

Nuxt3

Nuxt3基于Vue3,插槽的使用更加简洁和强大。例如,在layouts/default.vue中:

<template><div><Head /><header><slot name="header" /></header><main><slot /></main><footer><slot name="footer" /></footer></div>
</template>

在页面中使用:

<template><div><template #header><h1>Nuxt3页面标题</h1></template><p>Nuxt3页面内容</p><template #footer><p>Nuxt3页面底部</p></template></div>
</template>

在数据传递方面,Nuxt3可以利用组合式API中的useState等函数来共享数据。比如创建一个共享的用户登录状态数据,在header插槽中根据登录状态展示不同内容:

<template><div><Head /><header><slot name="header"><template v-if="isLoggedIn"><span>欢迎,{{ user.name }}</span></template><template v-else><a href="/login">登录</a></template></slot></header><main><slot /></main><footer><slot name="footer" /></footer></div>
</template><script setup>
import { useState } from '#imports';
const { state: user, isLoggedIn } = useState('user', () => ({name: '',loggedIn: false
}));
</script>

在页面中使用时:

<template><div><template #header><!-- 这里可以根据需求覆盖默认的header插槽内容 --></template><p>Nuxt3页面内容</p><template #footer><p>Nuxt3页面底部</p></template></div>
</template>

总结

插槽在Vue2、Vue3以及不同版本的Nuxt中都是非常重要的特性,不仅能实现内容的灵活插入,还能通过作用域插槽等方式实现数据的传递。通过合理使用插槽及其数据传递功能,可以提高组件的复用性和灵活性,构建出更加复杂和高效的应用程序。无论是基础插槽、具名插槽还是作用域插槽,都在不同场景下发挥着关键作用,开发者需要根据具体需求选择合适的插槽使用方式和数据传递策略。

相关文章:

【前端】【vue】vue2/3,nuxt的插槽使用详解

插槽在Vue2、Vue3和不同版本Nuxt中的使用 Vue2中的插槽 基础插槽 在Vue2中&#xff0c;基础插槽允许在组件的模板中定义一个占位符&#xff0c;然后在使用组件时插入自定义内容。例如&#xff0c;创建一个简单的MyBox组件&#xff1a; <template><div class"…...

Stable Diffusion 安装教程(附安装包) 【SD三种安装方式,Win+Mac一篇文章讲明白】

“Stable Diffusion的门槛过高、不会安装&#xff1f;没关系&#xff0c;这篇文章教会你如何安装&#xff01;” Stable Diffusion的安装部署其实并不困难&#xff0c;只需简单点击几下&#xff0c;几分钟就能安装好&#xff0c;不管是windows还是苹果mac电脑&#xff0c;关于…...

网络安全用centos干嘛 网络安全需要学linux吗

网络安全为啥要学Linux系统&#xff0c;据不完全统计&#xff0c;Linux系统在数据中心操作系统上的份额高达70%。它一般运行于服务器和超级计算机上。 所以我们日常访问的网站后台和app后端都是部署在Linux服务器上的&#xff0c;如果你不会Linux系统操作&#xff0c;那么很多…...

使用Opencv方法进行模板匹配

1. 引言 模板匹配&#xff08;Template Matching&#xff09;是一种基于图像处理的模式识别技术&#xff0c;主要用于在目标图像中查找与给定模板最匹配的区域。它在目标检测、工业检测、机器人视觉等领域有广泛应用。本文将详细介绍传统图像处理方法实现模板匹配的基本原理、…...

jupyter notebook中3种读图片的方法_与_图片翻转(上下翻转,左右翻转,上下左右翻转)

已有图片cat.jpg 相对于代码的位置&#xff0c;可以用./cat.jpg进行读取。 下面是3种读图片的方法。 1.python读图片-pillow 图片文件不适合用open去读取 用open读图片&#xff0c;易引发UnicodeDecodeError: gbk codec cant decode byte 0xff in position 0: illegal multib…...

微软官方出品GPT大模型编排工具:7个开源项目

今天一起盘点下&#xff0c;12月份推荐的7个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、一个浏览器自动化操作的.Net开源库 这是一个基于 Google 开源的 Node.js 库 Puppeteer 的 .NET 开源库&#xff0c;方便开发人员使用无头 Web 浏览器抓取 Web、检索 Ja…...

MongoDB 的批量查找符号

一、$in 操作符 1. 功能 $in 操作符用于匹配字段值等于指定数组中任意值的文档&#xff0c;能批量查找多个特定值的文档。 2. 语法示例 db.collection.find({ field: { $in: [value1, value2, ...] } }); 3. 代码示例 假设有个名为 users 的集合&#xff0c;里面存有用户…...

bash shell笔记——循环结构

0 引言 本文主要介绍linux bash shell循环结构的基本使用 1 测试环境 查看系统版本&#xff1a; uname -a : Ubuntu 18.04 查看bash版本&#xff1a; bash -version : GNU bash, version 4.4.20(1)-release 创建.sh文件&#xff1a; vim 00test.sh 修改00test.sh权限&…...

rpx和px混用方案

&#xff08;1&#xff09;创建一个全局的样式配置文件&#xff1a; // styles/variables.scss :root {// 基础字体大小--font-size-xs: 12px;--font-size-sm: 14px;--font-size-md: 16px;--font-size-lg: 18px;// 响应式间距--spacing-xs: 5px;--spacing-sm: 10px;--spacing-…...

解释下SpringBoot中的服务、依赖项、微服务、分布式的概念和关系

在Spring Boot中&#xff0c;服务、依赖项、微服务和分布式是常见的概念&#xff0c;它们之间的关系如下&#xff1a; 1. 服务&#xff08;Service&#xff09; 定义&#xff1a;服务是应用程序中处理业务逻辑的组件&#xff0c;通常封装了特定的功能。作用&#xff1a;服务层…...

机器视觉--Halcon变量的创建与赋值

一、引言 在机器视觉领域&#xff0c;Halcon 作为一款强大且功能丰富的软件库&#xff0c;为开发者提供了广泛的工具和算子来处理各种复杂的视觉任务。而变量作为程序中存储和操作数据的基本单元&#xff0c;在 Halcon 编程中起着至关重要的作用。正确地创建和赋值变量是编写高…...

ES常用查询

根据编号查询 GET custom/_search { "query": { "term": { "no": "abc" } } } 查询指定的列 GET custom/_search { "_source": ["id", "no"], "size": 10000, …...

数据库与表的基本操作

创建订货管理系统数据库。数据库名称为Ordering&#xff0c;其数据文件的逻辑名称为Ordering_Data&#xff0c;存放在C盘的Order文件夹下&#xff1b;日志文件的逻辑名称为Ordering_Log&#xff0c;存放在C盘的Order文件夹下。数据库中包含数据表&#xff0c;分别为数据表C&…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter12-BOM

十二、BOM 虽然 ECMAScript 把浏览器对象模型&#xff08;BOM&#xff0c;Browser Object Model&#xff09;描述为 JavaScript 的核心&#xff0c;但实际上 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象。 HTML5 规范中有一部分涵盖…...

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…...

GBD研究——美国州级地图(附资源)

美国州级别地图 地图源很多&#xff0c;随便下载。不过我试了两个资源&#xff0c;发现有的资源会漏掉阿拉斯加和夏威夷。 就剩大的这块佩奇 出现这样的问题&#xff0c;要么跟数据源有关&#xff0c;要么就是要掉地名来看&#xff0c;是不是没匹配上。 亲自试过&#xff0c…...

【微服务学习一】springboot微服务项目构建以及nacos服务注册

参考链接 3. SpringCloud - 快速通关 springboot微服务项目构建 教程中使用的springboot版本是3.x&#xff0c;因此需要使用jdk17&#xff0c;并且idea也需要高版本&#xff0c;我这里使用的是IDEA2024。 环境准备好后我们就可以创建springboot项目&#xff0c;最外层的项目…...

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...

【Elasticsearch源码解读】代码包结构概述

Elasticsearch的代码库包含多个包&#xff0c;每个包负责不同的功能。以下是这些包的主要功能&#xff1a; #### action 封装了Elasticsearch的各种操作&#xff0c;如索引、搜索、删除等&#xff0c;提供了与集群交互的接口。 #### bootstrap 包含启动Elasticsearch节点所…...

DeepSeek 概述与本地化部署【详细流程】

目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…...

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins&#xff1b; 2.支持自定义启动参数&#xff1b; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址&#xff1a;https://get.j…...

【NLP251】命名实体识别常用模块(基于Transformer分类)

1. 从JSON格式的数据中加载并预处理样本供Ner任务训练和推理使用 class JsonNerDataset(Dataset):"""定义一个加载json格式原始命名实体识别格式数据的Dataset一行一条样本(json字符串)&#xff0c;包含: originalText、entities"""def __init_…...

3D打印技术:如何让古老文物重获新生?

如何让古老文物在现代社会中焕发新生是一个重要议题。传统文物保护方法虽然在一定程度上能够延缓文物的损坏&#xff0c;但在文物修复、展示和传播方面仍存在诸多局限。科技发展进步&#xff0c;3D打印技术为古老文物的保护和传承提供了全新的解决方案。我们来探讨3D打印技术如…...

基于python sanic框架,使用Nacos进行微服务管理

微服务软件系统构建方式,已经很普及了,通过开源的sanic进行微服务管理,便捷,技术也比较成熟,而在项目实际应用过程中,微服务类型不仅有java的,还有nodejs、python等,尤其是结合算法模型构建的python接口,需要在Nacos进行注册管理。本文内容耗时2天踏坑,亲测一切ok。 …...

Vue h函数到底是个啥?

h 到底是个啥&#xff1f; 对于了解或学习Vue高阶组件&#xff08;HOC&#xff09;的同学来说&#xff0c;h() 函数无疑是一个经常遇到的概念。 那么&#xff0c;这个h() 函数究竟如何使用呢&#xff0c;又在什么场景下适合使用呢&#xff1f; 一、h 是什么 看到这个函数你可…...

深入浅出 Python Logging:从基础到进阶日志管理

在 Python 开发过程中&#xff0c;日志&#xff08;Logging&#xff09;是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题&#xff0c;还能提供丰富的数据支持&#xff0c;让应用更具可观测性。本文将带你全面了解 Python logging 模块&#xff0c;涵盖…...

Android WindowContainer窗口结构

Android窗口是根据显示屏幕来管理&#xff0c;每个显示屏幕的窗口层级分为37层&#xff0c;0-36层。每层可以放置多个窗口&#xff0c;上层窗口覆盖下面的。 要理解窗口的结构&#xff0c;需要学习下WindowContainer、RootWindowContainer、DisplayContent、TaskDisplayArea、T…...

创建一个新的 React Native 项目

之前一直使用 npx react-native init my_app 来创建 RN 项目, 但是新版本会报错: Need to install the following packages: react-native0.77.0 Ok to proceed? (y) y npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: unde…...

Linux vmstat 命令

作用 性能监控工具。 示例 vmstat 2 5&#xff1a;每 2 秒执行 1 次&#xff0c;共执行 5 次。 下列示例中加了 -w 80 参数增加显示长度&#xff0c;目的是对齐字段值&#xff0c;Ctrl C 可停止输出。 [rootlocalhost ~]# vmstat 2 -w 80 procs -----------------------me…...

2025年最新版1688平台图片搜索接口技术指南及Python实现

随着电商行业的蓬勃发展&#xff0c;1688作为国内领先的B2B交易平台&#xff0c;其商品搜索功能对于买家和卖家而言都至关重要。图片搜索作为其中的一种高级搜索方式&#xff0c;能够极大地提升用户的搜索体验和准确性。本文将详细介绍如何通过API接口实现1688平台的图片搜索功…...