Vue(六)插槽(2.6.0+)
插槽在vue2.6.0开始有了新的更新
具名插槽(数据来自父组件)
子组件(定义插槽)这里版本前后没什么变化
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template> <script>
export default {
name: "BaseLayout"
}
</script>
父组件(使用)这里版本后废弃了slot="header"这样的写法,在vue3.0后直接移除。取而代之的是v-slot:插槽名称的写法,默认插槽(没有名字,默认为default),缩写为#header
<template>
<base-layout>
<template v-slot:header>
<h1>Header</h1>
</template> <template v-slot:default>
<p>Main</p>
</template> <template v-slot:footer>
<p>Footer</p>
</template>
</base-layout>
</template>
<script>
import BaseLayout from "../components/BaseLayout";
export default {
components: {BaseLayout}
}
</script>
使用缩写#的代码
<template>
<base-layout>
<template #header>
<h1>Header</h1>
</template> <template #default>
<p>Main</p>
</template> <template #footer>
<p>Footer</p>
</template>
</base-layout>
</template>
<script>
import BaseLayout from "../components/BaseLayout";
export default {
components: {BaseLayout}
}
</script>
页面

作用域插槽(数据来自子组件)【2.6.0起,v-slot取代了slot和slot-scope】
子组件(定义了数据并且将数据绑定到特定属性[user]上)
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<!--绑定在 <slot> 元素上的特性被称为插槽 prop-->
<slot :user="userData">
{{userData.lastName}}
</slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template> <script>
export default {
name: "BaseLayout",
data: () => ({
userData: {
firstName: 'AAA',
lastName: 'Miss'
}
})
}
</script>
父组件(给 v-slot 带一个值来定义我们提供的插槽 prop 的名字[slotProps])这里废弃了slot="default" slot-scope="slotProps"的写法,直接v-slot:default="slotProps"或者#default="slotProps"
<template>
<base-layout>
<template #header>
<h1>Header</h1>
</template>
<!--slotProps可以使任意名字-->
<template #default="slotProps">
<strong style="color: crimson">{{slotProps.user.firstName}}</strong>
</template> <template #footer>
<p>Footer</p>
</template>
</base-layout>
</template>
<script>
import BaseLayout from "../components/BaseLayout";
export default {
components: {BaseLayout}
}
</script>
数据关系:

页面:

以上代码的意思是,本来这里的后备内容是显示lastName的,我们可以在父组件那里做手脚,让后备内容显示的是firstName。但是无论怎么做,数据都是来自子组件。
将父组件的指定的后备内容注释掉即可显示原生的内容,如下:

页面:

另外一个例子(写一个表格组件,灵感来源于Vuetify框架,没读过它的内部实现,但是一眼能看出使用了插槽,根据我的理解写出下面的例子)
定义:MyTable.vue
<template>
<table>
<slot name="headers">
<tr>
<th v-for="h in headers" :key="h">{{h}}</th>
</tr>
</slot>
<!--这里的插槽prop绑定了当前的数据 :items="i" -->
<slot name="items" v-for="i in items" :items="i">
<tr :key="i[itemKey]" :title="i[itemKey]">
<td v-for="j in i" :key="j">{{j}}</td>
</tr>
</slot>
</table>
</template> <script>
export default {
name: "MyTable",
// 自定义属性
props: ["headers","items","itemKey"],
}
</script> <style scoped>
table{
width: 200px;
margin: 25px auto;
border-collapse: collapse;
border: 1px solid #ddd;
}
table tr,table td{
border-collapse: collapse;
border: 1px solid #ddd;
padding: 8px 10px;
}
</style>
使用:
<template>
<div class="about">
<!-- ********************作用域插槽的应用******************** -->
<!--直接使用-->
<my-table :headers="headersData" :items="itemsData" item-key="id"></my-table>
<!--父组件利用插槽自定义-->
<my-table :headers="headersData" :items="itemsData" item-key="id">
<!--有了作用域插槽,可以由父组件来改变子组件的展示效果-->
<!--在父级作用域中,我们可以给 v-slot 带一个【值】来定义我们提供的插槽 prop 的名字-->
<!--【值】也就是那个 props,可以为任意名字-->
<template v-slot:items="props">
<tr>
<td style="color: darkcyan">{{props.items.id}}</td>
<td style="color: darkcyan">{{props.items.name}}</td>
<td style="color: darkcyan">{{props.items.age}}</td>
</tr>
</template>
</my-table>
<!-- ********************作用域插槽的应用******************** -->
</div>
</template>
<script>
import MyTable from "../components/MyTable"; export default {
name: 'about',
components: {MyTable},
data: () => ({
headersData: ["ID", "Name", "Age"],
itemsData: [
{id: 1, name: 'A', age: 10},
{id: 2, name: 'B', age: 20},
{id: 3, name: 'C', age: 12},
{id: 4, name: 'D', age: 15}
]
})
}
</script>
<style scoped> </style>
页面:(前者直接使用,后者利用作用于插槽改变了颜色)

变量关系

其它
对于默认插槽,我们可以变成更加简洁的写法:
<template v-slot:default="slotProps">
<strong style="color: crimson">{{slotProps.user.firstName}}</strong>
</template>
变成(不带参数的 v-slot 被假定对应默认插槽)
<template v-slot="slotProps">
<strong style="color: crimson">{{slotProps.user.firstName}}</strong>
</template>
对于缩写 #,有限制条件,那就是只能有参数名的情况下才能使用,即:#header=“”。而不带的话会报错,即:#=“”
Vue(六)插槽(2.6.0+)的更多相关文章
- vue.js插槽
具体讲解的url https://github.com/cunzaizhuyi/vue-slot-demo //例子 用jsfiddle.net去运行就好 <!DOCTYPE html> ...
- 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面
一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...
- vue slot 插槽详解
插槽含义:就是引入子组件后,在插入子组件元素中添加信息或者标签,使得子组件的指定位置插入信息或者标签 插槽有三种:默认插槽.具名插槽.作用域插槽,由于vue2.6.0后对插槽进行修改,但是兼容2.6. ...
- 通过UI库深入了解Vue的插槽的使用技巧
Vue官网对于插槽的介绍比较简略,插槽本身也比较"烧脑",很容易看晕,我就一直没看懂,直到 使用了element-plus的组件的插槽. 其实我们可以换一个角度来理解插槽,就会豁然 ...
- vue父子组件(1.0)
1.父子组件 在上一篇随笔中展示了vue的组件,当我们继续在组件中写组件,形成组件嵌套的时候,就是我们所说的父子组件了. <!DOCTYPE html> <html lang=&qu ...
- Vue中插槽指令
08.29自我总结 Vue中插槽指令 意义 就是在组件里留着差值方便后续组件内容新增 而且由于插件是写在父级中数据可以直接父级中传输而不需要传子再传父有些情况会减少写代码量 示例 <div id ...
- [Vue warn]: Duplicate keys detected: '0'. This may cause an update error.
1.[Vue warn]: Duplicate keys detected: '0'. This may cause an update error. 第一眼看到这个错误一脸懵逼,项目使用很久了,代码 ...
- vue 全局插槽 全局插座
场景: slot 能够让父组件内容插入到子组件中,但是子孙组件不能够使用slot直接插入内容.在弹窗的时候,全屏弹窗需要直接在组件最上层显示,如果父组件级别不够,弹出就可能不是全屏的. 知识点: 1: ...
- 细说Vue作用域插槽,匹配应用场景。
最近在官方文档中看到,vue新增了一种插槽机制,叫做作用域插槽.要求的版本是2.1.0+. 首先来说一下:顾名思义,所谓作用域插槽,主要就在作用域,需要注意的是(以下几点看不懂不要紧,配合下面的例子, ...
- [Vue]组件——插槽:slot(匿名插槽,具名插槽)与slot-scope(作用域插槽)
1.单个插槽 | 匿名插槽 1.1<navigation-link> 子组件定义为: <a v-bind:href="url" class="nav-l ...
随机推荐
- GlusterFS集群文件系统研究
https://blog.csdn.net/liuaigui/article/details/6284551 1. GlusterFS概述GlusterFS是Scale-Out存储解决方案G ...
- 域渗透:SPN(ServicePrincipal Names)的利用
SPN 简介:服务主体名称(SPN:ServicePrincipal Names)是服务实例(可以理解为一个服务,比如 HTTP.MSSQL)的唯一标识符.Kerberos 身份验证使用 SPN 将服 ...
- 关于new FormData() 对象的用法
formData.append() 理论上本身若键值已经存在,那么我们append的数据是进行类似push的操作,为了匹配php,我们进行加了[] ,这个操作.!
- learning java 重定向标准输入输出
output redirectionOut: public class RedirectOut { public static void main(String[] args) throws File ...
- Redis存储List
list中数据可以重复,查询快,增删慢. 存储结构: 1.向List存取数据: 查询list中的全部元素: 第一个进入a,第二个进入b,并将a向后移一位. 上图为从右边插入元素的情况. 2.从两头取出 ...
- circus web console 依赖tornado>3.2 无法访问的bug
circus web console 是一个很不错的web 监控circus 工具,但是对于高版本一直存在一个bug 信息如下 Traceback (most recent call last): F ...
- CSS行内元素
一.典型代表 span a ,strong em del, ins 二.特点: 在一行上显示 不能直接设置宽高 元素的宽和高就是内容撑开的宽高. <style type="text/c ...
- 【cf contest 1119 G】Get Ready for the Battle
题目 你有\(n\)个士兵,需要将他们分成\(m\)组,每组可以为0: 现在这些士兵要去攻打\(m\)个敌人,每个敌人的生命值为\(hp_i\) : 一轮游戏中一组士兵选定一个攻打的敌人,敌人生命值- ...
- 【loj2983】【WC2019】数树
题目 两颗\(n\)个点的树T1和T2,有\(y\)种颜色; 现在给每个点染色,要求公共边端点的颜色相同,求: 1.op=0 , T1和T2都确定,求合法染色方案数: 2.op=1 , T1确 ...
- HTML5之图片在Retina屏的常用几种处理方式
Media Queries使用css3的媒体查询实现高清屏的图片处理. @media only screen and (-webkit-min-device-pixel-ratio: 1.5), on ...