vue组件插槽

组件的插槽

组件本身就是一个容器,也可以是一个vue对象,也是一个虚拟DOM

普通插槽

组件本身是一个容器,这个容器本身是空的,当我们把需要封装的html结构装进去之后,我们可以认为这个容器被塞满了,那就意味着,我们无法想组件内部添加新的html结构进去,但是我们想在每次调用组件的时候需要渲染一些个性化的东西,这个时候我们就需要给组件做一个预留空间,这个预留空间就是插槽

<body><div id="app"><one><p>我是子标题</p></one></div><template id="temp1"><div><h2>我是标题</h2></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1"}new Vue({el:"#app",components:{one}})
</script>

代码分析:

以上的代码渲染之后,我们在虚拟DOM中写入了一个p标签,着就是所谓的插入,但是并没有效果,因为我们并没有在one组件中预留空间,也就是插槽

如果想在组件内部预留插槽,使用 <slot></slot>

<body><div id="app"><one><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p></one></div><template id="temp1"><div><h2>我是标题</h2><slot><!-- 组件内预留给插槽的空间 --></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1"}new Vue({el:"#app",components:{one}})
</script>
一个插入点插入多个插槽

现在我们想让刚才的代码中前3个p标签出现在标题的上方,后面3个出现在标题的下方

<body><div id="app"><one><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p><p>我是子标题</p></one></div><template id="temp1"><div><slot></slot><h2>我是标题</h2><slot></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1"}new Vue({el:"#app",components:{one}})
</script>

代码分析:

上面的代码中,我们发现,在模板中的标题上方也制作了一个插槽slot,但是,从效果上来看只是单纯把插入的内容复制了一份,分别插入不同的插槽里面

其实我们上面写的都是默认插槽,把插槽语法写完成如下

<div id="app"><one><p slot="default">我是子标题</p><p slot="default">我是子标题</p><p slot="default">我是子标题</p><p slot="default">我是子标题</p><p slot="default">我是子标题</p><p slot="default">我是子标题</p></one>
</div>
<template id="temp1"><div><slot name="default"></slot><h2>我是标题</h2><slot name="default"></slot></div>
</template>

默认情况下,所有的slot都必须要指定一个name,只是如果我们不自己指定的话,系统会给我们指定一个默认的名称default

具名插槽

在上面的插槽中,我们所有的slot如果在不指定name的情况下全都是default,但是这个name属性可以设置的,如果设置一些其他的值,我们就把这个插槽叫做具名插槽

<div id="app"><one><p slot="top">我是子标题</p><p slot="top">我是子标题</p><p slot="top">我是子标题</p><p slot="bottom">我是子标题</p><p slot="bottom">我是子标题</p><p slot="bottom">我是子标题</p></one>
</div>
<template id="temp1"><div><slot name="top"></slot><h2>我是标题</h2><slot name="bottom"></slot></div>
</template>

代码分析:

在上面的代码中,我们可以为插槽取一个名字,从而实现一对多,或者多对一的插入,当插槽有了名字之后,我们就可以在插入的时候指定插入到某一个插槽中

  • 我们组件里面定义插槽的时候使用slot标签,并且这个标签上面定义name属性,成为具名插槽
  • 在调用组件的时候,我们可以向指定的插槽插入内容,只需要在这个插入的元素上面添加一个slot=“插槽名”即可
  • 具名插槽是可以多次使用的,所以我们可以把上面的top复制一份放到bottom的下面,这样上面三个p标签也会出现在下面的插槽里面

插槽作用域

<body><div id="app"><one><p>我想要拿到组件内部的userName</p></one></div><template id="temp1"><div><h2>我是一个组件</h2><slot><!-- 组件的预留空间 --></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1",data(){return {userName:"zhangsan"}}}new Vue({el:"#app",components:{one}})
</script>

之前我们一直都是外部的数据传递给内部,如果要把组件内部的数据传递给外部,我们可以:

1、利用对象的堆栈原理

2、自定义事件

注意:

我们现在要做一个区分,我们是可以把数据渲染在组件里面的,也可以渲染在插槽里面,但是这两种方式在向组件外部传值的时候是有区别的,我们上面说的这两种方法,只针对在组件内渲染的,如果是渲染在组件的插槽内部的,我们可以通过插槽作用域取拿

比如我们现在要userName的值传递到外面,我们可以在插入的标签上面添加一个slot-scope=“scope”

<body><div id="app"><one><div slot-scope="scope"><p>{{scope.userName}}</p><p>{{scope.age}}</p></div>            </one></div><template id="temp1"><div><h2>我是一个组件</h2><slot :user-name="userName" :age="18"><!-- 组件的预留空间 --></slot></div></template>
</body>
<script src="js/vue.js"></script>
<script>let one = {template:"#temp1",data(){return {userName:"zhangsan"}}}new Vue({el:"#app",components:{one}})
</script>

插槽作用域旧版本语法

<div id="app"><one><div slot="footer" slot-scope="scope"><p>{{scope.userName}}</p><p>{{scope.age}}</p></div>            </one></div><template id="temp1"><div><h2>我是一个组件</h2><slot name="footer" :user-name="userName" :age="18"><!-- 组件的预留空间 --></slot></div></template>

新版本语法

<one><template v-slot:footer="scope"><p>{{scope.userName}}</p><p>{{scope.age}}</p></template>            
</one>

最新语法

<one><template #footer="{userName,age}"><p>{{userName}}</p>"<p>{{age}}</p></template>            
</one>

代码分析:

最新语法可以直接解构获取,并且v-slot这个指令也直接使用#来替代,简化代码

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

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

相关文章

WIN11家庭中文版使用ENSP+VirtualBox启动AR失败40错误+未完全关闭hyper-V,以及安装VirtualBox兼容性问题

使用版本&#xff1a;eNSP 1.3.00.100VirtualBox 5.2.44WinPcap_4_1_3Wireshark最新版。 win11系统最好按照上述版本安装&#xff0c;VirtualBox不要安装更高版本&#xff0c;否则可能出现不兼容情况&#xff0c;Wireshark版本要求还好&#xff0c;安装顺序是VirtualBox 5.2.4…

python+pytest接口自动化之参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。比如&#xff1a;B接口的某个或某些请求参数是通…

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈&#xff0c;制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备&#xff0c;实现生产线的智能化和自适应生产&#xff0c;优化生产流程&#xff0c;提高生产效率和质量&#xff0c;为企业创造更大的价值。 方案概述 智…

Gif表情包怎么用图片制作?一招简单易上手

很多朋友对于gif动图的名字不是很熟悉&#xff0c;但是对于“gif表情包”一定很熟悉吧&#xff01;在日常网络聊天中经常能见到其的身影&#xff0c;能够调节聊天的气氛。想要制作gif表情包可以使用gif动图在线制作&#xff08;https://www.gif.cn/&#xff09;网站-GIF中文网&…

【C语言期末】题目+解析

文章目录 题目1.下面哪个不是C语言的基本数据类型&#xff1f;&#xff08; B &#xff09;2.C语言的标识符应以字母或&#xff08; A &#xff09;开头。3.如果需要在C程序里调用标准函数库中的printf函数&#xff0c;则应该在程序的开头包含哪个头文件&#xff1f;&#xff0…

学习Linux(2)-学习Linux命令

Linux目录结构 Linux目录结构-菜鸟教程 /bin&#xff1a;bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a;这里存放的是启动 Linux 时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev &#xff1a;dev 是 De…

TensorFlow 常用代码

TensorFlow 是由 Google 开发的一个用于数值计算的开源软件库&#xff0c;主要用于构建和训练机器学习模型。它的核心是使用数据流图来描述计算任务。数据流图是由节点和边组成的有向图&#xff0c;每个节点表示一个计算任务&#xff0c;每条边表示数据传输。 TensorFlow 支持…

Dockerfile文件

什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Docke…

C语言-字符串操作函数-附加使用方式

文章目录 前言字符串复制-strcpy字符串复制&#xff08;按照位数&#xff09;-strncpy字符串比较-strcmp字符串比较(按照位数)-strncmp不区分大小写的字符串比较-strcasecmp不区分大小写的比较(前n位)-strncasecmp字符串按照格式写入-sprintf字符串按照格式和个数写入-snprintf…

JUC包(面试常问)

1. Callable接口 类似于Runnable接口&#xff0c;Runnable描述的任务&#xff0c;不带返回值&#xff1b;Callable描述的任务带返回值。 public class Test {//创建线程&#xff0c;计算12...1000public static void main(String[] args) throws ExecutionException, Interru…

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子&#xff08;包括jQuery中常见的与索引相关的选择器&#xff09; 1. 操作table常见的1.1 动态给table添加title&#xff08;指定td&#xff09;1.1.1 给td动态添加title&#xff08;含&#xff1a;获取tr的第几个td&#xff09;1.1.2 动态加工…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(23)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(22) 上一回讲解了i915_gem_object_lookup_rcu函数的第1个参数struct drm_file *file,本回讲解其第2个参数u32 handle。 (2)参数u32 handle 说起来,handle要比struct drm_file *file参数好理解多了…

怎么更改android的包名,使其可以变成另外一个app

在 Android 中更改应用的包名并不是一项简单的任务&#xff0c;因为包名在应用的整个代码和配置文件中都被广泛使用。但是&#xff0c;你可以通过以下步骤来更改应用的包名&#xff1a; 注意&#xff1a;在更改包名之前&#xff0c;请确保备份你的项目&#xff0c;以防发生意外…

thinkphp 结合swoole 聊天开发实例

好的&#xff0c;下面我为您介绍使用ThinkPHP和Swoole开发聊天应用的实例。 环境搭建 首先需要安装PHP和Swoole扩展&#xff0c;可以使用以下命令&#xff1a; yum install php php-devel php-pear pecl install swoole新建项目 使用composer新建一个ThinkPHP项目&#xff…

每日一练【三数之和】

一、题目描述 15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可…

【开题报告】基于SSM的校园体育管预约系统的设计与实现

1.选题背景 随着社会的发展和人们对健康生活的追求&#xff0c;体育锻炼在大学生群体中越来越受到重视。校园体育场馆是大学生进行体育活动和锻炼的主要场所之一。然而&#xff0c;由于校园体育场馆资源有限&#xff0c;管理不善和预约流程繁琐等问题&#xff0c;导致场馆利用…

【数据结构(九)】线索化二叉树(3)

文章目录 1. 前言——问题引出2. 线索二叉树的基本介绍3. 线索二叉树的应用案例3.1. 思路分析3.2. 代码实现 4. 遍历线索化二叉树4.1. 代码实现 1. 前言——问题引出 问题&#xff1a;     将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. &#xff08;n17个空指针域&…

1688API接口系列,商品详情数据丨搜索商品列表丨商家订单类丨1688开放平台接口使用方案

1688商品详情接口是指1688平台提供的API接口&#xff0c;用于获取商品详情信息。通过该接口&#xff0c;您可以获取到商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口&#xff0c;您需要先申请1688的API权限&#xff0c;并获取ac…

老有所依:TSINGSEE青犀养老院智能视频监管方案

养老院智能监控方案是为了提高养老院内老人的安全和护理质量&#xff0c;利用智能技术与监控设备进行全方位的监控和管理&#xff0c;可以加强对老人的监护和护理&#xff0c;提高养老院的服务质量和安全性。 旭帆科技基于视频技术与AI智能分析技术构建的养老院智能视频监控方…

[动态规划]最长公共子序列

题目六 最长公共子序列 题目描述 我们称一个字符的数组S为一个序列。对于另外一个字符数组Z,如果满足以下条件&#xff0c;则称Z是S的一个子序列&#xff1a;&#xff08;1&#xff09;Z中的每个元素都是S中的元素&#xff08;2&#xff09;Z中元素的顺序与在S中的顺序一致。…