插槽(slot)
插槽在vue中是一种很常见的写法,让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式

一共有三种分类:默认插槽、具名插槽、作用域插槽,下面一一根据案例改造说明

1 基本案例
首先编写一个基本的案例,三个组件展示不同的数据类型

页面进行展示

现在要改需求,美食的列表只展示一个海报图片,电影则展示一段宣传视频,游戏则不变

如果要按照美食的需求去改统一加上照片

那么三个列表都有了这个照片

当然可以使用v-show判断

虽然可以实现效果,但是比较麻烦,而且电影的列表如果也按照这样判断,那么代码维护性特别低,逻辑非常混乱

这时候就可以使用插槽了

2 插槽的基本使用
所谓插槽,其实就是挖个坑,等着使用者进行填充

下面的案例是一个最基本的单个插槽使用,也叫默认插槽

比如下面我改造了下代码,在组件标签里面写一个doc元素

但是查看的时候发现什么都没有

这是因为虽然定义了元素,但是vue不知道去组件哪个地方填充,这个时候我们需要在被需要填充的组件里面定义一个插槽(slot)标签

这样我就可以只需要一个插槽,对不同的组件进行不同的元素展示了,如下

图片,列表,视频,我想要什么就定义什么,组件只需要一个插件接收即可,这样就能实现动态展示同一个组件不同的数据

值得注意点是,虽然通过组件标签把数据和资源传输到了组件中并使用插槽进行展示,但是都是通过app这个组件进行传输的,所以对元素的样式控制,完全可以在app.vue里面处理完之后再传递

当然如果非要把样式在用到插槽的组件中进行处理,也是没问题的

不管在那处理,都是一样的

插槽的默认值
插槽是可以定义默认值的,当没有对插槽进行填充的时候,就会展示默认值,如下所示我把组件里面的内容注释掉了,这时候就会出现插槽的默认值:

图片被默认值取代了

3 具名插槽
默认插槽是插槽家族中最简单的使用方式,下面的具名插槽则是比它稍微复杂些的一个使用方式

顾名思义,它指的是具有名字的插槽

所以改下上面的需求,在原有的基础上,加入更多的元素,通过另外一个插槽实现,也就是多个插槽

如果直接复制一个默认插槽,肯定是不行的

发现全部的元素都出现了两份,这不是我们想要的效果

插槽确实需要些多个,但是需要name指定插槽的名称

但是发现还是不行

因为虽然给插槽命名了名称,但是插入内容的时候并没有告诉对应的插槽,所以需要使用slot属性去标识具体的插槽

多个插值小技巧
如果有多个元素需要使用同一个插槽是不会进行数据覆盖的,这种情况我们可以定义一个div,然后在div中指定插槽的name

一样的效果

template使用技巧
如果想要多个元素并且不想再多生成一个无用的div,可以使用template标签

template的v-slot写法
一旦使用了template标签,就有了第二种写法了,这是vue2.6提出来的,v-slot:xxx

v-slot的写法只能作用于template标签上,不信你看,这里我加到了div身上

直接报错了

以上就是具名插槽的用法了

4 作用域插槽
说完了默认插槽和具名插槽,接下来就是插槽的最后一种用法:作用域插槽

说到作用于大多数人想到的是js的作用域,这个作用域插槽还真和js的作用域有几分相似

现在有一个需求,根据菜单生成的数据还是一样的数据,但是展示方式不同

比如第一个列表还是无序的,第二个列表是有序的,第三个列表则要把游戏名称以h4的形式展现

这时候就可以借助作用域插槽了

如果正常写

会报错,表示找不到games

这就是一个作用域的问题,我们传递了games,需要在接收方定义template使用scope属性进行接收

另外一种写法

老是写传递的参数有点烦,就可以使用这种写法

传递多个属性
不止可以传递一个属性,比如:

效果都是一样的

5 插槽总结
作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件 。
分类:默认插槽、具名插槽、作用域插槽
使用方式:
1 默认插槽:

父组件中:
<Category>
<div>html结构1</div>
</Category>
子组件中:
<template>
<div>
<!-- 定义插槽 -->
<slot>插槽默认内容...</slot>
</div>
</template>

2 具名插槽:

父组件中:
<Category>
<template slot="center">
<div>html结构1</div>
</template> <template v-slot:footer>
<div>html结构2</div>
</template>
</Category>
子组件中:
<template>
<div>
<!-- 定义插槽 -->
<slot name="center">插槽默认内容...</slot>
<slot name="footer">插槽默认内容...</slot>
</div>
</template>

3 作用域插槽
1 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
2 具体编码:

父组件中:
<Category>
<template scope="scopeData">
<!-- 生成的是ul列表 -->
<ul>
<li v-for="g in scopeData.games" :key="g">{{g}}</li>
</ul>
</template>
</Category> <Category>
<template slot-scope="scopeData">
<!-- 生成的是h4标题 -->
<h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>
</template>
</Category>
子组件中:
<template>
<div>
<slot :games="games"></slot>
</div>
</template> <script>
export default {
name:'Category',
props:['title'],
//数据在子组件自身
data() {
return {
games:['红色警戒','穿越火线','劲舞团','超级玛丽']
}
},
}
</script>

最后的话

插槽技术是Vue.js中重要的组件化特性之一,为我们提供了灵活的组件化开发方式,通过合理使用插槽,我们可以轻松地定制和扩展组件的功能,使组件的可复用性和灵活性大大提高。

vue中的插槽详解的更多相关文章

  1. Vue中Vuex的详解与使用(简洁易懂的入门小实例)

    怎么安装 Vuex 我就不介绍了,官网上有 就是 npm install xxx 之类的.(其实就是懒~~~哈哈) 那么现在就开始正文部分了 众所周知 Vuex 是什么呢?是用来干嘛的呢? Vuex ...

  2. 关于Vue中props的详解

    看一下官方文档: 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据.父组件的数据需要通过 prop 才能下发到子组件中. 也就是props是子组件访问父组件数 ...

  3. Vue.js 数据绑定语法详解

    Vue.js 数据绑定语法详解 一.总结 一句话总结:Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue ...

  4. Vue组件通信方式全面详解

    vue组件通信方式全面详解 众所周知,Vue主要思想就是组件化开发.因为,在实际的项目开发中,肯定会以组件的开发模式进行.形如页面和页面之间需要通信一样,Vue 组件和组件之间肯定也需要互通有无.共享 ...

  5. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  6. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  7. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  8. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  9. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  10. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

随机推荐

  1. [POJ2891]Strange Way to Express Integers公式推导

    没啥事干,想着推个式子玩玩. 题目链接 题意不过多赘述,直接上过程: 由题意得 \[\begin{cases} x\equiv a_1\,(mod\,\, n_1) \\ x\equiv a_2\,( ...

  2. Mac远程控制工具有哪些

    适用于Mac的远程控制工具有很多,这里我们给大家列举五个常用软件. 1.Apple Remote Desktop 苹果自带远程桌面正如其名称所承诺的那样.作为 Apple 出品的应用程序,您可以想象它 ...

  3. PageOffice 在线打开 word 文件实现痕迹保留、键盘批注、手写批注

    一.痕迹保留 Word中的痕迹一般指的是审阅文档的用户对文档所做的修改(插入和删除)操作.在PageOffice的强制留痕模式下,用户对文档所做的任何修改都会以痕迹的形式保留下来,不同用户对文档做的修 ...

  4. 环境声音分类的深度 CNN 模型

    具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI 声音事件的分类精度与特征提取有很强的关系.本文将深度特征用于环境声音分类(ESC)问题.深层特征是通过使 ...

  5. Laravel 模块化开发模块 – Caffienate

    Laravel多模块配置   1. 安装对应版本"caffeinated/modules" composer require caffeinated/modules 相应版本号 L ...

  6. 记录一下Android usb相关的知识学习

    在SecondStageMain中会先调用PropertyInit做属性初始化,该方法会调用PropertyLoadBootDefaults加载持久化的属性主要加载位置: /system/build. ...

  7. FastJson转Java对像字段不区分大小写

    昨天遇到参数key大小写不一致导致校验签名失败的问题,查了很长时间才找到原因.看了一下FastJson源码,发现JSON.toObject中转换成对象的时候会忽略大小写. 所以,当使用了JSON.to ...

  8. LeetCode 683. K Empty Slots K 个空花盆 / LintCode 861. K个空的位置 (C++/Java)

    题目: 一个花园有N个位置.每个位置上有一朵花.这N朵花会在N天内逐一盛开.每天都一定会有并且只有一朵花盛开,从这天起,这朵花将一直处于盛开的状态. 给定一个由数字1到N组成的数组flowers.数组 ...

  9. Easysearch 内核完善之 OOM 内存溢出优化案例一则

    最近某客户在使用 Easysearch 做聚合时,报出 OOM 导致掉节点的问题,当时直接让客户试着调整 indices.breaker.request.limit ,但是不起作用,于是又看了下 Ea ...

  10. Angular 集成 StreamSaver

    应用场景: 实现目标: 在网页端实现大文件(文件大小 >= 2 G) 断点续传 实际方案: 发送多次请求, 每次请求一部分文件数据, 然后通过续写将文件数据全部写入. 难点: 无法实现文件续写, ...