Vue:关于插槽的详解
Vue:插槽Slot
- 一、默认插槽
- 1、代码演示
- 2、语法
- 二、具名插槽
- 1、代码演示
- 2、语法
- 3、动态插槽名
- 三、作用域插槽
- 1、渲染作用域
- 2、作用域插槽(实战应用)
- (1)finalList.vue
- (2)cardList.vue
- (3)card.vue
- (4)最终效果
- 小结
- 3、简单应用demo
- 四、插槽的多层嵌套
- 1、需求
- 2、代码演示
- 3、代码效果
- 4、核心点
一、默认插槽
1、代码演示
通过上述代码,我们至少了解以下2点:
1.插槽里可以有默认内容,
2.默认插槽,组件的内容会全部替换到插槽中
2.父组件的数据也可以显示到子组件中(数据的作用域,后面作用域插槽会用到)
2、语法
定义插槽:<slot>插槽的默认内容</slot>
使用插槽:<组件> 内容全部替换到插槽中 </组件>
二、具名插槽
1、代码演示
具名插槽:简单理解,就是为每个
<slot>
进行命名,以进行区分。
注意:默认插槽也是有name
的,name='default'
2、语法
定义插槽:<slot name="one"></slot>
使用插槽:<template v-slot:one> <div>{{ msg }}</div> </template>
插槽简写:<template #one> <div>{{ msg }}</div> </template>
3、动态插槽名
动态插槽名:
现在定义的插槽名都是固定写死的,Vue也支持将插槽名定义为变量。
定义插槽:<slot :name="name"></slot>
使用插槽:<template #[name]> <div>动态插槽名</div> </template>
三、作用域插槽
1、渲染作用域
渲染作用域:
父级模板里的所有内容都是在父级作用域中编译的
子模板里的所有内容都是在子作用域中编译的
因此也产生了一个问题:
假设第一个场景,需要你写一个商品卡片组件,并通过循环去展示多个卡片,
并且要求能响应每个卡片上的点击事件而跳转到商品详情页,你会怎么写?
我会使用如下的处理方式,
- 首先将商品卡片写成一个组件
card.vue
,- 在
cardList.vue
中用一个v-for
来处理商品卡片列表的展示。card.vue
组件通过$emit
向父组件传递cardClick
事件,并携带商品数据,- 父组件即可在
onClick
方法中得到数据,进行业务处理,- 这样便完成了一个基本的由子到父的数据传递。
// cardList.vue
<template><div class="card"><Card v-for="item in cardData" :key="item" @cardClick="onClick()"></Card></div>
</template>// card.vue
<template><div class="div" @click="onClick()">卡片</div>
</template>
<script>
export default {methods: {onClick () {this.$emit('cardClick')}}
}
</script>
如果再往上抽象一下呢?
比如有多个运营栏目,像淘宝首页有“有好货”,“爱逛街”这样两个栏目,每个栏目下都需要有一个商品卡片列表,那么商品卡片列表cardList.vue
就要抽成组件了。而这个包含多个运营栏目的vue组件我假设它叫finalList.vue
,在其中通过v-for
调用了cardList.vue
组件。
注意:
需求来了—>我希望把点击商品卡片的业务放在finalList.vue
中处理。要如何处理呢?
方法1:
- 商品按钮点击时,
card.vue
组件用$emit
通知cardList.vue
,cardList.vue
继续用$emit
往上抛,通知finalList.vue
finalList.vue
用事件接收处理。
这样做完全没有问题,但是显得子组件很不纯粹,跟业务都扯上关系了。
2、作用域插槽(实战应用)
那么如何优雅地解决上面的问题呢?这个时候,作用域插槽真正派上用场了。
我们先看下通过作用域插槽是如何解决上面问题的。
(1)finalList.vue
// src\views\06slot\finalList.vue
<template><div><div v-for="item in '123'" :key="item"><div style="text-align: left;">第{{ item }}个</div><CardList :cardData="cardData" class="cardlist"><template v-slot="scope"><Card :cardObj="scope.row" @click.native="cardClick(scope.row)" class="card"></Card></template></CardList></div></div>
</template><script>
import Card from './card.vue'
import CardList from './cardList.vue'
export default {components: {Card,CardList},data () {return {cardData: [{ name: 'zs', age: 18 },{ name: 'ls', age: 19 }]}},methods: {cardClick (row) {console.log('卡片点击了:' + row.name + '--' + row.age)}}
}
</script><style scoped>
.cardlist {display: flex;
}
.card {margin: 10px 20px;}
</style>
(2)cardList.vue
// src\views\06slot\cardList.vue
<template><div><div v-for="(item, index) in cardData" :key="index"><slot :row="item"></slot></div></div>
</template><script>
export default {props: {cardData: {type: Array}}
}
</script>
<style scoped>
</style>
(3)card.vue
// src\views\06slot\card.vue
<template><div class="div"><div>{{ cardObj.name }}</div><div>{{ cardObj.age }}</div></div>
</template><script>
export default {props: {cardObj: {type: Object,default: () => { }}}
}
</script>
<style scoped>
.div {width: 100px;height: 100px;background-color: pink;
}
</style>
(4)最终效果
小结
关于作用域插槽:
简单理解:作用域插槽就是简化
子组件通过$emit向父组件多层传递
数据的另一种表现
适用的场景:至少是包含三级以上的组件层级,是一种优秀的组件化方案!
3、简单应用demo
- 父组件访问子组件的数据:
- 父组件获取组件slot属性:
v-slot="slotProps"
, - 子组件将数据绑定到动态属性中:
<slot :item="item"></slot>
- 父组件获取组件slot属性:
- 按照父组件期望的形式进行数据展示:
- 子组件中定义slot插槽:
<slot :item="item" :index="index"></slot>
- 父组件通过插槽的方式替换子组件的插槽内容
- 子组件中定义slot插槽:
四、插槽的多层嵌套
1、需求
A、B、C三个组件,A组件插槽的内容传给B组件,B组件再传递给C组件。
2、代码演示
// src\views\06slot\parent.vue
<template><div><Children1><template v-slot:one><div>根节点信息</div></template></Children1></div>
</template>// src\views\06slot\children1.vue
<template><div><div>children1</div><Children2><slot name="one" slot="two"></slot></Children2></div>
</template>// src\views\06slot\children2.vue
<template><div><div>children2</div><slot name="two"></slot></div>
</template>
3、代码效果
4、核心点
- A组件用
v-slot:one
将内容传递给B组件 - B组件用
name="one"
接收插槽的内容,并通过slot="two"
将内容传递个C组件。即:<slot name="one" slot="two"></slot>
- C组件用
<slot name="two"></slot>
接收A组件的内容
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/392062.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!相关文章:

Vue:关于插槽的详解
Vue:插槽Slot一、默认插槽1、代码演示2、语法二、具名插槽1、代码演示2、语法3、动态插槽名三、作用域插槽1、渲染作用域2、作用域插槽(实战应用)(1)finalList.vue(2)cardList.vue(3…...

【HDFS】从BlockPoolSlice#createRbwFile到BlockReceiver()
BlockPoolSlice#createRbwFile的过程FsDatasetImpl#createRbw的源码详解需要构造BlockReceiver的几种情况讨论从FsDatasetImpl#createRbw,经过FsVolumeImpl#createRbw,最终会调用BlockPoolSlice#createRbwFile的方法。 看下createRbwFile,主要功能就是在rbw目录下根据block…...

Anaconda搭建TensorFlow2.x
本篇文章介绍如何使用Anaconda快速搭建Python环境下的TensorFlow2.x开发框架 Anaconda搭建TensorFlow2.x过程 关于 Anaconda Anaconda就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包…...

Node.js入门:path 模块学习
前言 上文讲解了 Node.js 的 CommonJS 规范,它主要用来解决模块化的问题。从本文开始将会介绍 Node.js 常用的模块,包括内置模块以及好用,好玩的第三方模块。 本篇简单介绍下 path 模块的用法。 path 模块 path 模块提供了用来处理目录和…...

TCP协议的可靠性
TCP作为传输层协议,提供可靠的传输服务。可靠性:保证消息不重复、不丢失、不乱序。如何保证可靠性:TCP协议依据面向连接、流量控制、拥塞控制特性达到可靠的目的。1 三次握手TCP连接建立使用三次握手,三次握手目的是使双方都得到确认…...

Java项目——文档搜索引擎
文章目录1. 项目概述2. 准备阶段2.1 项目创建2.2 准备静态页面3. 搜索逻辑4. 分词5. 处理 HTML 文件5.1 枚举文件夹中所有文件5.2 预处理文件5.2.1 获取标题5.2.2 获取 URL5.2.3 获取正文6. 索引6.1 正排索引和倒排索引6.2 往正排索引中添加元素6.3 往倒排索引中添加元素6.3.1 …...

yum仓库及NFS共享
目录 yum配置文件及命令 yum配置文件 yum命令详解 本地yum仓库搭建 存储和NFS共享 存储类型 NFS简介 NFS特点 实验 yum配置文件及命令 yum配置文件 主配置文件 /etc/yum.conf #主配置文件 仓库设置文件 /etc/yum.repos.d/*.repo #yum仓库文件位置 日志文件 /v…...

【设计模式之美 设计原则与思想:面向对象】06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
在上两节课中,我们讲了面向对象这种现在非常流行的编程范式,或者说编程风格。实际上,除了面向对象之外,被大家熟知的编程范式还有另外两种,面向过程编程和函数式编程。面向过程这种编程范式随着面向对象的出现…...

【源码解析】Ribbon实现负载均衡
背景 在SpringCloud系列中,Eureka实现了服务注册中心,Feign实现了动态代理,Ribbon实现了负载均衡。如果注册中心上某个服务注册了多个实例,ribbon可以通过一定的规则获取特定的实例。 源码解析 RibbonClient使用入口 Synchro…...

配置安全的linux-apache服务器(5)
实验简介 实验所属系列:Linux网络服务配置与安全 实验对象: 本科/专科信息安全专业、网络工程 相关课程及专业:系统安全配置、服务器配置、计算机网络 实验时数(学分):2学时 实验类别:实践实验…...

基于机智云智能宠物屋的APP控制系统
机智云物联网自主研发的开发板Gokit在智能家居系统管理方面起到了关键优势,集成多种通信,智能恒湿,风速调节,耗材管理,温湿度显示,手机APP或微信小程序控制,语音控制,缺水管理等等功…...

C#问题——Unity中 继承MonoBehaviour的类,Awake和构造函数的先后顺序,以及非继承类中构造函数实例化的时间.
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 Unity中 继承MonoBehaviour的类,Awake和构造函数的先后顺序,以及非继承类中构造函数实例化的时间.…...

Web3D工厂可视化,工厂三维可视化大屏,工厂模型展示,统计图表,人员定位,人车轨迹运动,电子围栏
前言随着物联网技术和WebGL技术的不断发展,工厂三维可视化大屏正在成为一个越来越受欢迎的解决方案。利用Three.js这一优秀的WebGL渲染引擎,可以帮助我们在Web端实现高质量的三维可视化效果,为工厂管理和生产优化提供重要的帮助。本文将介绍如…...

python3-算法刷题-字符串-更新中
459. 重复的子字符串 https://leetcode.cn/problems/repeated-substring-pattern/ 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 思路: 如果…...

5级流水线ARM组织
所有的处理器都要满足对高性能的要求。指定ARM7为止,在ARM核中使用的3级流水线的性价比是很高的。但是,为了得到更高的性能,需要重新考虑处理器的组织结构。执行一个给定的程序需要的时间由下面公式决定: Tprog(NinstC…...

QJson详细介绍
QJson JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言…...

ChatGPT 辅助编程
前言 总结一些在编程中使用 ChatGPT 的命令,以助力提升开发效率。 文章目录前言一、作用二、举例1. 写代码2. 解析程序3. 找 Bug4. 语言转换5. Python 实现人工智能相关代码一、作用 利用 ChatGPT 快速生成代码,程序员拿到代码后稍加修改完善实现自己的…...

vue3 脚手架vue-cli创建项目过程
1、安装node 安装地址 > https://nodejs.org/en/ 选择 LTS 长期维护的稳定版本 在电脑 window R cmd,打开终端命令行输入node -v 查看node版本,说明安装好了 vue3要求node版本至少是10.0以上 npm -v,安装了node之后本地会自动安装工具…...

基于MATLAB编程的长短期神经网络LSTM的大豆期货价格预测
目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的大豆期货价格预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 期货预测是一种比较难预测的数学问题,有很多模型进行研究,但是都有局限性,准确率不高…...

【Redis从入门到进阶】第 2 讲:Jedis 的快速掌握
本文已收录于专栏🍅《Redis从入门到进阶》🍅专栏前言 本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用…...