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 ...
随机推荐
- 35 Top Open Source Companies
https://www.datamation.com/open-source/35-top-open-source-companies-1.html If you think of open sour ...
- python面试题&练习题之运算符与if控制
1.任意的输入10个数字,按从大到小排序 l2 = [] for i in range(1,11): num = input('输入第{}个数字'.format(i)) if num.isdigit( ...
- python的any()函数
any()函数的参数是一个可迭代对象,其中的一个元素有一个为真,则any()函数返回真,除非全部为假的时候才返回假. aaa=[,,,] print(any(aaa)) 返回:false
- LeetCode 1219. Path with Maximum Gold
原题链接在这里:https://leetcode.com/problems/path-with-maximum-gold/ 题目: In a gold mine grid of size m * n, ...
- api的url规则设计,带参数的路由
api的url设计规则 router := gin.Default() router.GET("/topic/:topic_id", func(context *gin.Conte ...
- React-Router常见API
React-Router是React项目中处理路由的库. 1. HashRouter 通过hashchange监听路由的变化,通过window.location.hash赋值触发监听的变化. 本质是一 ...
- Oracle 对比insert和delete操作产生的undo
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/wangqingxun/article/de ...
- Windbg命令脚本
命令脚本,就是将完成某个特定任务的相关命令组合在一起,保存在脚本文件里,加载到Windbg里执行,达到我们的目的.你可以理解为脚本就是一种语言,就像c或者汇编,但是他不需要编译器将其编译为可执行文件, ...
- 【loj2568】【APIO2016】【学习笔记 左偏树】烟花表演
题目 一棵树,\(n\)个非叶子节点,编号为\(1-n\),\(m\)个叶子节点,编号为\(n+1-n+m\) 每条边有边权,修改边权的代价为\(|a-b|\) ; 定义一个叶子的距离为到1(根节点) ...
- Web前端鼠标悬停实现显示与隐藏效果
css定义,偏移量,相对定位,绝对定位 显示与隐藏 二维码相对于微信图标定位 鼠标悬停微信图标上显示 鼠标离开微信图标时隐藏 什么是定位,就是定义网页标签在运行时显示的位置 css提供Position ...