Vue2 插槽的使用【默认插槽、具名插槽、作用域插槽】

news2024/10/6 0:36:05

 前言:

      这篇文章我们一起来学习一下 Vue2 插槽的使用,文章大致分为两个模块,第一部分是什么是插槽,其作用是什么,第二部分为三种插槽的使用,分别为默认插槽,具名插槽,作用域插槽,相信大家学习完这篇文章后一定会受益匪浅

 文章目录:

一:什么是插槽

二:默认插槽 

2.1 默认插槽说明

2.2 默认插槽使用 

三:具名插槽 

3.1 具名插槽说明

3.2 具名插槽使用

四:作用域插槽 

4.1 作用域插槽说明

4.2 作用域插槽使用


一:什么是插槽

       例如老板要让你使用组件写分类栏,然后使用该组件生成两个分类栏,这两个分类栏里的数据都不一样,但是整体结构是一样的,这就要求组件的结构一样,但是内部 DOM 结构是由使用组件的时候决定的,这就需要插槽,其就像放在组件中的占位标签,使用组件时我们将要放到占位标签处的DOM结构写入组件标签体中即可。

       例如如下图例子,第一个分类框我们要展示热门电影,第二个分类框我们要展示一张风景图,整体的框架是一样的,只是其内部填充的东西不一样下面会做出更深刻的理解。


二:默认插槽 

2.1 默认插槽说明

      此板块我们讲述第一个插槽:默认插槽。之前我们使用组件的时候,引入进 App.vue 后注册就可以采用 自闭合 与  完整组件标签 的方式使用,以下就是常采用的自闭合与完整组件标签方式(以 test组件为例)

<template>
     <test/>  //自闭合方式
     <test></test>   //完整组件标签的方式
</template>

         但是插槽的使用我们就要把要放在插槽中的内容写在组件标签体内,例如我们要在插槽中放入一个 ul 列表,那么我们使用组件时就要这样书写:

<template>
     <test>  //组件标签
        <ul>
            <li></li>
            <li></li>
            <li></li>
         </ul>
     </test> 
</template>

       接下来说说默认插槽的写法,如果我们只在使用组件时的组件标签体内写上内容,那页面上是显示不出来任何东西的,这是因为标签体内的内容确实被解析了,但是vue不知道要把这些东西放在组件中 template 的哪个位置,故我们要在组件的 template 中设置一个插槽来占位,以保证使用组件时其解析的内容可以放入占的位置中去。占位我们使用一个很重要的标签 ------ slot,我们需要在组件的 template 中这样书写:

<template>
   <div>
       <span>我是一个组件,下面是我的插槽内容</span>
       <slot></slot>   //默认插槽
   </div>
</template>

这样使用组件时组件标签体中的内容就可以放入组件的默认插槽中了

2.2 默认插槽使用 

       我们来实现一下上述的分类案例,让第一个分类展示电影,第二个分类放一张图片进去,但整体组件结构一样

 classify.vue组件:

<template>
   <div class="classify-box">
       <div class="title">{{name}}</div>
       <slot></slot>  //slot设置默认插槽来占位
   </div>
</template>

<script>
export default {
   name:'Classify',
   data() {
    return {    
    }
   },
   props:['name']   //propos接收传来的标题名称
}
</script>

<style scoped>
    //css太占地方就删掉了
</style>

App.vue组件:

<template>
  <div class="app-box">
    <Classify name='热门电影'>  //使用组件并在组件标签体中书写要放进插槽中的内容
         <ul>
            <li>肖申克的救赎</li>
            <li>1912</li>
            <li>零的执行人</li>
         </ul>
     </Classify>
     <Classify name="风景">
          <img src="./img/QQ图片20220818163031.jpg" alt="">
     </Classify>
  </div>
</template>

<script>
import Classify from './components/classify.vue'  //引入组件
export default {
  name: 'App',
  data() {
    return {   
    }
  },
  components: {     
      Classify:Classify   //注册组件
  }
}
</script>

<style scoped>
    //css太占位置删掉了
</style>

这样就可以实现一个最基本的默认插槽案例了 


三:具名插槽 

3.1 具名插槽说明

       具名插槽其实只是在默认插槽的基础上给每个插槽起了名字,作用为可以在组件中设置多个插槽,可以更具体细分。首先给组件插槽起名字,使用 name="xxx"

<template>
   <div>
       <span>我是一个组件,下面是我的多个具名插槽内容</span>
       <slot name="header"></slot>   //header具名插槽
       <slot name="body"></slot>   //body具名插槽
       <slot name="footer"></slot>   //footer具名插槽
   </div>
</template>

        上面就在组件中定义好了三个具名插槽,下面我们来看使用插槽的写法,依旧是在使用组件标签时在标签体内写入内容,但是要注意要使用 slot="xxx" 写在组件标签体外层盒子上来指明放入哪个插槽中

<template>
  <div class="app-box">
    <Classify>
      <div slot="header">   //放入header插槽
         <span>我在header插槽中</span>
      </div>  
      <div slot="body">     //放入body插槽
         <span>我在body插槽中</span>
      </div>  
      <div slot="footer">    //放入footer插槽
         <span>我在footer插槽中</span>
      </div>
     </Classify>
  </div>
</template>

       上面的写法其实并不完善,slot写在每个指定插槽的外层大盒子 div 上了,这样会给其增加一层 DOM 结构,我们最好把 div 换成 template 标签,因为 template 标签不会被解析,结构更清晰不多余。

3.2 具名插槽使用

下面简单实现一下具名插槽的使用

 classify.vue组件:

<template>
   <div class="classify-box">
       <div class="title">下面是具名插槽的内容</div>
       <slot name="header"></slot>
       <slot name="body"></slot>
       <slot name="footer"></slot>
   </div>
</template>

<script>
export default {
   name:'Classify',
   data() {
    return {   
    }
   },
}
</script>

<style scoped>

</style>

App.vue组件:

<template>
  <div class="app-box">
    <Classify>
      <div slot="header">
         <span>我在header插槽中</span>
      </div>  
      <div slot="body">
         <span>我在body插槽中</span>
      </div>  
      <div slot="footer">
         <span>我在footer插槽中</span>
      </div>
     </Classify>
  </div>
</template>

<script>
import Classify from './components/classify.vue'
export default {
  name: 'App',
  data() {
    return {
      
    }
  },
  components: {
      Classify:Classify
  }
}
</script>

<style scoped>

</style>

这样就简单实现了具名插槽 


四:作用域插槽 

4.1 作用域插槽说明

       作用域插槽较难理解,但其简单解释就是带有数据的插槽,把组件中的数据绑定给插槽,然后谁使用这个组件谁就能拿到这个数据使用,也相当于一种数据通信,其需要这样把数据绑定定义给组件插槽(名称没有要求)

<template>
   <div class="classify-box">
       <div class="title">下面是作用域插槽的内容</div>
       <slot :hobby="hobby"></slot>  //将数据绑定给组件插槽
   </div>
</template>

<script>
export default {
   name:'Classify',
   data() {
    return {   
      hobby:['打游戏','睡大觉','吃大餐']  //要绑定的数据
    }
   },
}
</script>

然后就要使用组件时使用 slot-scope="xxx" 去接收,或者直接使用 scope,要注意的是此处标准一点最好写在 template 中,这里的 xxx 不需要和组件插槽中起的名字一样,随便起就行。然后我们打印一下接收到的数据看看其是什么

<template>
  <div class="app-box">
    <Classify>
         <template slot-scope="datas">
            <div>{{datas}}</div>
        </template>
    </Classify>
  </div>
</template>

       可以看到我们接受到了一个对象,对象中包含的是你插槽中绑定的所有数据(我们只绑定了一个所以对象里只有一组数据),对此我们就能在组件标签体中使用得到的数据了

 

4.2 作用域插槽使用

下面简单实现一下作用域插槽的使用

 classify.vue组件:

<template>
   <div class="classify-box">
       <div class="title">下面是作用域插槽的内容</div>
       <slot :hobby="hobby"></slot>
   </div>
</template>

<script>
export default {
   name:'Classify',
   data() {
    return {   
      hobby:['打游戏','睡大觉','吃大餐']
    }
   },
}
</script>

<style scoped>
  
</style>

App.vue组件:

此处 slot-scope 接收的数据使用了es6解构把数据解构出来了

<template>
  <div class="app-box">
    <Classify>
        <template slot-scope="{hobby}">
            <ul>
              <li v-for="(h,index) in hobby" :key="index">{{h}}</li>
            </ul>
        </template>
    </Classify>
  </div>
</template>

<script>
import Classify from './components/classify.vue'
export default {
  name: 'App',
  data() {
    return {
      
    }
  },
  components: {
      Classify:Classify
  }
}
</script>

<style scoped>

</style>

这样就简单实现了作用域插槽的案例

 感谢支持

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue快速上门|虚拟DOM

直接操作DOM,DOM频繁变动会使得页面不停的布局、渲染,是很消耗性能的,虚拟DOM就是来解决这个问题的。虚拟DOM 就是先在内存中构建一个虚拟DOM结构(JS对象表示),批量操作完成后再一次性的更新到浏览器DOM树上。VUE中的虚拟DOM操作思路也是如此,只是为了更高效,实际要稍微…

[附源码]Node.js计算机毕业设计大数据与智能工程系教师档案管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Docker之RUN、COMMAND、ENTRYPOINT辨析

一 回顾docker一些命令 ① run create start 的辨析 docker run 等价 docker create && docker start容器(动态) 镜像(静态) 读写层1&#xff09; create 命令为指定的镜像&#xff08;image&#xff09;添加了一个可读写层,构成了一个新的容器注意&#xff1…

RNA-seq 详细教程:详解DESeq2流程(9)

学习目标 了解 DESeq2 涉及的不同步骤了解变异的来源并检查 size factors检查基因水平的离散估计了解差异表达分析过程中离散的重要性DESeq2流程 前面&#xff0c;我们使用设计公式创建了 DESeq2 对象&#xff0c;并使用下面两行代码运行DESeq2&#xff1a; dds <- DESeqDat…

《野球少年》:王牌投手·棒球联盟

身为一名投手&#xff0c;原田巧是位拥有着拔群棒球才能的少年。在初中入学时移居的山间城镇新田市&#xff0c;巧与接住自己全力投球的捕手永仓豪相遇了。进入新田东中学棒球部的两人&#xff0c;被卷入部员间的摩擦以及教师们的大人事情&#xff0c;时而相互产生冲突&#xf…

喊一声“嘿!GitHub”,说出需求VS Code就能自己写代码了

喊一句“嘿&#xff01;GitHub”&#xff0c;说出你的需求&#xff0c;代码自动来&#xff01; Python中导入pandas库&#xff0c;只需说一句“import pandas”&#xff1a; 长句语音、一连串命令&#xff0c;都不在话下&#xff1a; 嗯&#xff0c;就是和Siri一个味儿&#x…

ETDR 0A 电缆故障测试仪 手持便携式 电缆故障脉冲反射仪 可测30KM

用途&#xff1a; ETDR 10A-3 采用低压脉冲反射技术&#xff0c;用于快速、 精确测试通信或电力电缆的故障距离。 多种测试模式&#xff0c;适用于断线、短路、低阻、间歇性等故障类型&#xff0c;并能测试接头的位置。 使用环路脉冲发生器(ES 2002)可以更容易测试有分支的电缆…

实验五、U_GSQ对共源放大电路电压放大倍数的影响

一、题目 UGSU_{GS}UGS​ 对共源放大电路 A˙u\dot A_uA˙u​ 的影响。 二、仿真电路 共源放大电路如图(ccc)所示&#xff0c;其中MOS场效应管型号为2N7000。 三、仿真内容 图1(a)为2N7000相关的参数&#xff0c;图1(b)为其转移特性&#xff0c;以作为参考&#xff08;需注…

Python + ffmepg + nginx-html-flv实现摄像头的实时播放

Python ffmepg nginx-html-flv实现摄像头的实时播放 这段时间有个项目需要捕获摄像头的画面&#xff0c;做轨迹分析之后再做显示。做了四天的调研&#xff0c;虽然结果我还不是特别满意&#xff0c;但也颇有收获&#xff0c;在这里做一下总结。 整体的结构大概是这样的&…

redis高并发问题以及解决方案

文章目录1.高并发读操作问题1.1缓存穿透1.2缓存击穿1.3缓存雪崩2.高并发写问题2.1数据库双写不一致问题2.2双写不一致问题解决方案2.2.1延时双删2.2.2队列2.2.3分布式锁1.高并发读操作问题 1.1缓存穿透 指访问一个缓存和数据库中都不存在的key&#xff0c;由于这个key在缓存中…

[附源码]Node.js计算机毕业设计大学生心理健康咨询系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Python计算机毕业设计吃到撑零售微商城Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析

总览 在这里&#xff0c;我们放宽了流行的线性方法的假设。最近我们被客户要求撰写关于非线性模型的研究报告&#xff0c;包括一些图形和统计输出。有时线性假设只是一个很差的近似值。有许多方法可以解决此问题&#xff0c;其中一些方法可以通过使用正则化方法降低模型复杂性…

计算机网络——应用层

应用层概述 计算机网络各层所解决的问题 我们在浏览器的地址中输入某个网站的域名后&#xff0c;就可以访问该网站的内容&#xff0c;这个就是万维网WWW应用&#xff0c;其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名&#xff0c;而…

115-127-mysql-高级篇-索引及结构

115-mysql-高级篇-索引及调优篇&#xff1a; 索引及调优篇 1、索引的数据结构 1. 索引及其优缺点 1.1 索引概述 索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 **索引的本质&#xff1a;**索引是数据结构。“排好序的快…

Java项目:SSM在线蛋糕商城销售网站项目

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为前后台项目&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 查看所有蛋…

[附源码]Python计算机毕业设计宠物托管系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

redis--主从复制、哨兵和cluster集群

一、介绍redis 在Redis中&#xff0c;实现高可用的技术主要包括持久化、主从复制、哨兵和cluster集群&#xff0c;下面分别说明它们的作用&#xff0c;以及解决了什么样的问题。 持久化&#xff1a; 持久化是最简单的高可用方法&#xff08;有时甚至不被归为高可用的手段&…

[网络工程师]-网络安全-数字签名和数字证书

随着《中华人民共和国电子签名法》这部法律的出台和实施&#xff0c;电子签名获得了与传统手写签名和盖章同等的法律效力&#xff0c;这意味着经过电子签名的电子文档在网上传输有了合法性。电子签名并非是书面签名的数字图像化&#xff0c;而是一种电子代码。联合国贸发会的《…

单源最短路径问题——分支限界法(Java)

单源最短路径问题——分支限界法&#xff08;Java&#xff09; 文章目录单源最短路径问题——分支限界法&#xff08;Java&#xff09;1、 前置芝士1.1 分支限界法求解目标1.2 分支限界法引言1.3 分支限界法基本思想1.4 两种典型的解空间树2、分支限界法解题过程2.1 算法要点2.…