插槽在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+)的更多相关文章

  1. vue.js插槽

    具体讲解的url https://github.com/cunzaizhuyi/vue-slot-demo //例子 用jsfiddle.net去运行就好 <!DOCTYPE html> ...

  2. 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面

    一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...

  3. vue slot 插槽详解

    插槽含义:就是引入子组件后,在插入子组件元素中添加信息或者标签,使得子组件的指定位置插入信息或者标签 插槽有三种:默认插槽.具名插槽.作用域插槽,由于vue2.6.0后对插槽进行修改,但是兼容2.6. ...

  4. 通过UI库深入了解Vue的插槽的使用技巧

    Vue官网对于插槽的介绍比较简略,插槽本身也比较"烧脑",很容易看晕,我就一直没看懂,直到 使用了element-plus的组件的插槽. 其实我们可以换一个角度来理解插槽,就会豁然 ...

  5. vue父子组件(1.0)

    1.父子组件 在上一篇随笔中展示了vue的组件,当我们继续在组件中写组件,形成组件嵌套的时候,就是我们所说的父子组件了. <!DOCTYPE html> <html lang=&qu ...

  6. Vue中插槽指令

    08.29自我总结 Vue中插槽指令 意义 就是在组件里留着差值方便后续组件内容新增 而且由于插件是写在父级中数据可以直接父级中传输而不需要传子再传父有些情况会减少写代码量 示例 <div id ...

  7. [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. 第一眼看到这个错误一脸懵逼,项目使用很久了,代码 ...

  8. vue 全局插槽 全局插座

    场景: slot 能够让父组件内容插入到子组件中,但是子孙组件不能够使用slot直接插入内容.在弹窗的时候,全屏弹窗需要直接在组件最上层显示,如果父组件级别不够,弹出就可能不是全屏的. 知识点: 1: ...

  9. 细说Vue作用域插槽,匹配应用场景。

    最近在官方文档中看到,vue新增了一种插槽机制,叫做作用域插槽.要求的版本是2.1.0+. 首先来说一下:顾名思义,所谓作用域插槽,主要就在作用域,需要注意的是(以下几点看不懂不要紧,配合下面的例子, ...

  10. [Vue]组件——插槽:slot(匿名插槽,具名插槽)与slot-scope(作用域插槽)

    1.单个插槽 | 匿名插槽 1.1<navigation-link> 子组件定义为: <a v-bind:href="url" class="nav-l ...

随机推荐

  1. 三.Python变量,常量,注释

    1. 运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确定后 写入代码python d:t1.py 您已经 ...

  2. 了解一下Elasticsearch的基本概念

    一.前文介绍 Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进.性能最好的.功能最全的 ...

  3. LeetCode 930. Binary Subarrays With Sum

    原题链接在这里:https://leetcode.com/problems/binary-subarrays-with-sum/ 题目: In an array A of 0s and 1s, how ...

  4. 用TortoiseSVN从github下载单个文件

    问题描述: github是一个很好的共享代码管理仓库,我们可以从github上直接以压缩包的形式直接download整个项目,也可以通过git,用git clone + URL 命令下载整个目录. 但 ...

  5. VS2010中使用boost正则表达式库

    1.下载boost库.http://www.boost.org/ 我下载的是boost_1_51_0版本.放在D:\opensource\boost_1_51_0. 2.编译boost库.     执 ...

  6. 计蒜客 39272.Tree-树链剖分(点权)+带修改区间异或和 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest E.) 2019ICPC西安邀请赛现场赛重现赛

    Tree Ming and Hong are playing a simple game called nim game. They have nn piles of stones numbered  ...

  7. 暂时性死区TDZ理解与总结

    为什么会出现暂时性死区? 先来看看 ES6 标准中对 let/const 声明中的解释 第13章,有如下一段文字:The variables are created when their contai ...

  8. go与python的不同

    go 开发中需要注意的与python的不同点 列出golang开发过程中与python的不同点,主要是在语法方面,golang的一些语法真是要人命啊. 1.golang可读性很强,与或对应&& ...

  9. MintUI引入vue项目以及引入iconfont图标

    官网地址:http://mint-ui.github.io/#!/zh-cn 中文文档:http://mint-ui.github.io/docs/#/zh-cn2 示例展示:http://eleme ...

  10. plsql 如何导入excel数据?

      oracle 导入excel数据? 通过plsql实现 1.准备工作 Excel中的字段名称,必须和表结构字段一 一对应 下面以tdoctor_apply表为例,进行演示 表结构 Excel表数据 ...