14-Vue插槽(slot),制作可复用组件

什么是 slot ?

 Vue 将 <slot>元素作为承载分发内容的出口。插槽内可以包含任何模板代码,包括 HTML或其它组件。

在某些组件的模板中,有一部分区域需要父组件来指定

<!-- message组件:一个弹窗消息 -->
<div class="message-container"><div class="content"><!-- slot是vue的内置组件 —— 插槽、占位 --><slot></slot></div><button>确定</button><button>关闭</button>
</div><!-- 父组件App -->
<Message><div class="app-message"><p>App Message</p><a href="">detail</a></div>
</Message><!-- 最终的结果 -->
<div class="message-container"><div class="content"><div class="app-message"><p>App Message</p><a href="">detail</a></div></div><button>确定</button><button>关闭</button>
</div>

 

具名插槽

如果某个组件中需要父元素传递多个区域的内容,也就意味着需要提供多个插槽

为了避免冲突,就需要给不同的插槽赋予不同的名字

如果是默认插槽,可以不写<template v-slot:default>
v-solt:header 可以简写为 #header

<!-- Layout 组件 -->
<div class="layout-container"><header><!-- 我们希望把页头放这里,提供插槽,名为header --><slot name="header"></slot></header><main><!-- 我们希望把主要内容放这里,提供插槽,名为default --><slot></slot></main><footer><!-- 我们希望把页脚放这里,提供插槽,名为footer --><slot name="footer"></slot></footer>
</div><!-- 父组件App -->
<BaseLayout><template v-slot:header><h1>Here might be a page title</h1></template><template v-slot:default><p>A paragraph for the main content.</p><p>And another one.</p></template><template v-slot:footer><p>Here's some contact info</p></template>
</BaseLayout>

作用域插槽

有时让插槽内容能够访问子组件中才有的数据是很有用的。

参见官网文档:插槽 — Vue.js

属性:

  • $slots:用于访问父组件传递的普通插槽中的 vnode
  • $scopedSlots:用于访问父组件传递的所有用于生成 vnode 的函数(包括默认插槽在内)

可复用的列表组件

利用插槽可以制作可复用的组件。比如实现一个通用的列表组件,列表的行为是公共的、可复用的,列表中显示的内容使用组件时再指定

实现思路:将列表数据(items)传递给列表组件,组件中使用 v-for 生成列表的框架,其中每个 item 通过 slot 展示,使用组件的代码中指定 slot 的内容。

列表组件
<li v-for="item in items" :key="item.id"><slot></slot>
</li>

 这里 slot 中的内容是和 item 相关的,所以替换 slot 的内容时必须能够访问到 item 的数据。

<my-list :items="items"><div>{{item.label}}</div>
</my-list>

但是这样写是无效的,因为

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

此时,我们要实现父组件能够访问子组件中的数据(item),可以使用作用域插槽;

将 item 作为 <slot> 元素的一个特性绑定上去:绑定在 <slot> 元素上的特性被称为插槽 prop

现在在父级作用域中,我们可以给 v-slot 带一个值来定义我们提供的插槽 prop 的名字。

列表组件
<li v-for="item in items" :key="item.id"><slot :item="item"></slot>
</li>

在父组件中访问子组件属性的方式:

<my-list :items="items"  v-slot="slotProps"><div>{{slotProps.item.label}}</div>
</my-list>

 这样写法太繁琐,可以使用 解构插槽 prop 简化:

<my-list :items="items" v-slot="{ item }"><div>{{item.label}}</div>
</my-list>

精读vue-virtual-scroller源代码,学习制作可复用组件(1) - 简书


深入理解插槽

例1:

注册了一个全局组件CompOne.vue

里面放着默认插槽,具名插槽,作用域插槽三种

 

 在父组件中使用

可以把 <CompOne> 这个组件看做一个对象

父组件把整个对象传递给了子组件CompOne

 例2:

使用render函数(以js文件的形式生成组件)CompTwo

 

div成功渲染 

 

 证明父组件中对应插槽是作为对象传到了子组件

子组件通过第二个属性 { slots } 解构获得了对象

默认插槽是作为返回值

作用域插槽是作为参数传递了

 每一个传递的插槽本质上就是一个函数,这里传了3个函数

子组件获得插槽的内容,相当于调函数

调用 slots.default() 函数,得到的是虚拟节点,并且是一个数组,因为传递的节点可能有多个

 

 要渲染到页面上,在返回值里面展开就可以得到了

 

 动态插槽

 名字是可变的

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

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

相关文章

组合取球-2022年全国青少年信息素养大赛Python国赛第6题

[导读]&#xff1a;超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲&#xff0c;这是超平老师解读Python编程挑战赛真题系列的第8讲。 全国青少年信息素养大赛&#xff08;原全国青少年电子信息智能创新大赛&#xff09;是“世界机器人大会青少年机器人设计…

安全防御 --- DDOS攻击(01)

DOS攻击&#xff08;deny of service&#xff09;--- 拒绝式服务攻击 例&#xff1a;2016年10月21日&#xff0c;美国提供动态DNS服务的DynDNS遭到DDOS攻击&#xff0c;攻击导致许多使用DynDNS服务的网站遭遇访问问题&#xff0c;此事件中&#xff0c;黑客人就是运用了DNS洪水…

LinearAlgebraMIT_5_SpacesOfVectors

这一节中我们将学习向量空间。 x.1 转置矩阵和构造对称矩阵 在开启向量空间的学习前我们先复习一下转置矩阵和置换矩阵。我们将矩阵转置前后不变的矩阵称为对称矩阵。而我们如何得到一个对称矩阵呢&#xff0c;我们使用矩阵乘以矩阵的转置便可得到。 x.2 Vectors Space 向量…

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

探究Vue源码:mustache模板引擎(5) 对比rollup与webpack,在本地搭建webpack环境

好 从本文开始 我们就来手写一下mustache这个库 他是模板引擎的一个祖先 将模板字符串编译成一个dom字符串 就是它的思想&#xff0c;这也是一个具有跨时代意义的思想 这里的话 我们还是搭一个 webpack 的项目环境 这里值得一提的是 mustache 他官方是通过rollup来进行打包的 …

简述JMeter实现分布式并发及操作

为什么要分布式并发&#xff1f; JMeter性能实践过程中&#xff0c;一旦进行高并发操作时就会出现以下尴尬场景&#xff0c;JMeter客户端卡死、请求错误或是超时等&#xff0c;导致很难得出准确的性能测试结论。 目前知道的有两个方法可以解决JMeter支撑高并发&#xff1a; …

微信小程序学习之数据绑定,事件绑定,事件传参与数据同步的学习记录

数据绑定&#xff0c;事件绑定&#xff0c;事件传参与数据同步 1. 数据绑定1.1. 在data中定义数据1.2. 在wxml中渲染数据 &#xff08;mustache语法&#xff09; 2. 事件绑定2.1. 事件2.2. 常用的事件2.3. 事件对象的属性列表2.4. target 和 currentTarget的区别 3. 事件传参与…

订单结算页+下单业务

一、订单结算页 1.业务分析 (1) 获取用户收货地址信息 一般的收货地址都是多个&#xff0c;使用时选中一个&#xff0c;所以收货地址使用List集合封装 (2)获取购物车商品信息 购物车商品也是多个&#xff0c;使用List集合封装 (3)查询商品库存 查询每个商品是否有库存&#…

Scrap爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面&#xff0c;特别是vue与react的普及&#xff0c;使用scrapy框架定位动态网页元素十分困难&#xff0c;而selenium是最流行的浏览器自动化工具&#xff0c;可以模拟浏览器来操作网页&#xff0c;解…

spring boot MySQL操作

极简spring boot MySQL测试 默认: spring boot环境已经搭好,可以跑最基本的hello world 有MySQL环境有部分测试数据表,并且有MySQL语法基础 配置 application.yml 如下配置,根据自己的数据库信息与个人需求配置 server: tomcat: uri-encoding: UTF-8 threads: …

使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

一、Feign介绍 Feign是一个声明式的HTTP客户端框架&#xff0c;用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分&#xff0c;旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。 Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下&am…

数据结构中队列的操作方式,一目了然

队列的概念 首先我们联想一下链表&#xff0c;在单链表中&#xff0c;我们只能对他的链表表尾进行插入&#xff0c;对链表的表头进行结点的删除&#xff0c;这样强限制性的链表&#xff0c;就是我们所说的队列。 也就是说&#xff0c;队列&#xff08;queue&#xff09;是限定…