理解Vue插槽

2023-11-07

引言:

在Vue开发中,我们多采用组件化开发。组件化开发最大特点就是对页面结构化划分,组件的复用。而在实际中,页面对组件的需求或许也稍有不同,那么就需要一种需求:为页面定制组件,解决的方式便是通过插槽。

实例:

<template id="myCpn">
  <div class="wrapper">
    <h1>自定义组件</h1>
    <h2>组件内容</h2>
  </div>
</template>

<body>
  <div id="app">
    <cpn></cpn>
    <cpn></cpn>
    <cpn></cpn>
  </div>
</body>

<script>
  Vue.component('cpn', {
    template: '#myCpn'
  })

  var vm = new Vue({
    el: "#app"
  })
</script>

 

运行上面代码结果:

 

 

描述:页面使用多个自定义组件(样式代码略),序号为方便叙述添加的且每个序号指向一个自定义组件。该组件在创建之初就已经设计好了样式和内容,所以在不同页面调用或在同一页面调用多次,其样式内容都是一样的。

需求:希望2号组件的内容展示为一个按钮,3号组件内容展示为一个链接。

解决方式:或许首先想到重写一个符合需求的2号组件和3号组件,但这样明显很麻烦,而且代码过于冗余。这里就引用插槽来解决。

代码展示

<template id="myCpn">
  <div class="wrapper">
    <h1>自定义组件</h1>
    <slot></slot>
  </div>
</template>

<body>
  <div id="app">
    <cpn>
      <h2>组件内容</h2>
    </cpn>

    <cpn>
      <button>按钮</button>
    </cpn>
    
    <cpn>
      <a href="#">链接</a>
    </cpn>
  </div>
</body>

 运行结果:

 

 

 通过在定义组件中将需要按需改变的部分用slot标签代替,而后在使用组件时将需要的元素添加进来,最后在渲染时该元素会替带模板中的slot,以上也是插槽最基础的应用方式。

概念:

插槽,也就是槽,是组件的一块HTML模板,这块模板显示不显示,以及怎样显示由父组件来决定。


插槽分类:

  • 默认插槽

默认插槽,也叫单个插槽、匿名插槽。它可以放在组件的任何位置,但一个组件中只能包含一个默认插槽,且不设置它的name属性

引言中的实例所使用的便是默认插槽。默认插槽除了上面展示的基础使用方式外,还可以为插槽定义默认值,所以之前代码也可以这样写:

<template id="myCpn">
  <div class="wrapper">
    <h1>自定义组件</h1>
    <slot>
      <!-- 定义插槽的默认值 -->
      <h2>组件内容</h2>
    </slot>
  </div>
</template>

<body>
  <div id="app">
    <cpn></cpn>

    <cpn>
      <button>按钮</button>
    </cpn>

    <cpn>
      <a href="#">链接</a>
    </cpn>
  </div>
</body>

另外一点就是,之前所展示的组件中都只含有一个元素,但其实组件内部可以写入多个元素,之后统一替换模板中的插槽。 

  • 具名插槽

具名插槽,很容易理解就是为匿名插槽添加一个name属性即可。而且具名插槽可以在一个组件中出现多次,且可以出现在任何位置

理解为什么要有具名插槽:

实例: 执行下面代码(样式略)

<template id="myCpn">
  <div class="wrapper">
    <h1>自定义组件</h1>
    <slot>
      <span>首部部分</span>
      <span>内容部分</span>
      <span>尾部部分</span>
    </slot>
  </div>
</template>

<body>
  <div id="app">
    <cpn></cpn>
  </div>
</body>

运行结果: 

 

可以看出在插槽中我们引入了三部分,如果有三个页面刚好需要分别修改这三部分(比如:将中文改为英文)。如果仅仅依靠单个插槽那么我们就需要写三份类似的代码,且都包含其他两个不需要修改的部分的代码,又会引起代码冗余。所以需要一种方式仅仅来修改需要改变的部分。这里就可以通过具名插槽的方式进行修改。

修改

在定义组件引入插槽时,为每一部分添加一个带有name属性的插槽。

<template id="myCpn">
  <div class="wrapper">
    <h1>自定义组件</h1>
    <slot name="header">
      <span>首部部分</span>
    </slot>
    <slot name="content">
      <span>内容部分</span>
    </slot>
    <slot name="tail">
      <span>尾部部分</span>
    </slot>
  </div>
</template>

 有了具名插槽,在之后页面修改时,可以根据name属性,进行指定部分的修改。

  <div id="app">
    <cpn>
      <span slot="header">The head section</span>
    </cpn>

    <cpn>
      <span slot="content">The content part</span>
    </cpn>

    <cpn>
      <span slot="tail">The tail section</span>
    </cpn>
  </div>

执行结果:为简便,这里只在同一组件实例下进行多次引用,并未在多个页面进行引用,但其用法和产生结果都是一样的。

 

 

  • 作用域插槽

作用域插槽,是父组件替换插槽标签,子组件决定显示内容。

理解作用域插槽:

实例

现有父子组件,子组件有一组数据数据,根据页面不同要求,希望子组件的数据分别以列表形式展示和水平方向展示。

<script>
  Vue.component('cpn', {
    template: '#myCpn',
    data() {
      return {
        // 子组件要展示的数据
        showData: ['C++', 'Java', 'Python']
      }
    },
  })

  var vm = new Vue({
    el: "#app"
  })
</script>

注:在此vm实例可以理解为一个父组件,所以根据Vue实例创建出来的全局组件就当作vm的子组件使用。

父组件这里根据需求设置数据展示的样式。

  // 父组件部分
  <div id="app">
    <!-- 列表形式展示 -->
    <cpn>
      <!-- slot-scope="lists"  用于声明slot对象 -->
      <template slot-scope="lists">
        <ul>
          <!-- 根据slot对象获取插槽绑定的data数据 -->
          <li v-for='item in lists.data'>{{item}}</li>
        </ul>
      </template>
    </cpn>
    
    <!-- 水平方向展示 -->
    <cpn>
      <template slot-scope="lists">
        <span v-for='item in lists.data'>{{item}} </span>
      </template>
    </cpn>

  </div>

 

 子组件部分进行数据绑定。

// 子组件部分
<template id="myCpn">
  <div class="wrapper">
    <h1>自定义组件</h1>
    <slot :data='showData'></slot>
  </div>
</template>

 

运行结果展示

 

根据实例过程,可以理解作用域插槽,因为父组件在进行样式设置时,无法直接访问子组件数据,通过引入插槽对象,这个对象在子组件定义时与子组件数据进行了绑定,使得之后在使用时可以访问到我们所需要的数据。

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解Vue插槽 的相关文章

  • neo4j 内存介绍

    描述Neo4j内存配置和使用的不同方面 内容翻译neo4j 操作手册 1 总览 1 1 操作系统内存 必须保留一些内存以运行操作系统本身的进程 不可能显式配置应为操作系统保留的RAM数量 因为这是在配置页面缓存和堆空间之后仍保持可用的RAM
  • 遍历子文件编码格式互换(UTF-8与GB2312)

    遍历子文件编码格式互换 UTF 8与GB2312 在日常开发中 我们经常会遇到需要将文件的编码格式从一种转换为另一种的情况 特别是在不同的操作系统和编辑器之间共享代码文件时 本篇文章将介绍一个Python脚本 用于遍历指定文件夹下的所有 c

随机推荐

  • 12月9号实验报告四

    完成apache服务器能够使用php解析 phtml php3 第一步 先修改配置文件httpd conf 添加 phtml php3 第二步 创建 phtml文件 php3文件 第三步 验证 phtml文件 php3文件
  • MyBatis(四) 主键生成策略

    1 数据库支持自动生成主键 若数据库支持自动生成主键的字段 比如 MySQL和 SQL Server 则可以设置useGeneratedKeys true 然后再把keyProperty 设置到目标属性上 mysql 支持自增主键 自增主键
  • Python3入门基础(10)一个对象

    Python3 面向对象 面向对象技术 与 Java 类似 类 Class 用来描述具有相同的属性和方法的对象的集合 它定义了该集合中每个对象所共有的属性和方法 对象是类的实例 方法 类中定义的函数 类变量 类变量在整个实例化的对象中是公用
  • discuz手机端默forum.php,discuz手机wap版模板开发方式简述

    近期项目需要对discuz论坛的手机模板进行开发调整 在官方论坛和搜索引擎找了很久 都没有找到相应的文章 只好自己着手开始研究 手机模板文件的所在目录 template default mobile 手机模板文件的主目录 template
  • 用Python+PIL将多个jpg图像批量合并成一个pdf文件

    一 引言 在 用Python PIL将目录下jpg图像批量转成pdf文件 介绍了将一个目录下所有的jpg文件批量转成一对一的pdf文件的方法 但单位后来又要求将所有图片合并到一个PDF中看 在实际工作中 确实有时还需要将批量图片文件合并生成
  • 用于视觉跟踪的在线特征选择研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 视觉跟踪是计算机视觉中的重要任务之一 它涉
  • QQuickWidget + QML编程实现酷炫动态动画效果

    1 具体需求 当Qt开发项目中需要实现简单的动态酷炫动画效果时 我们可以使用Qt中的QQuickWidget来实现 同时还可以使用QML编程来实现具体的动画效果 具体实现的效果如下所示 2 具体操作和实现效果图 1 按下start按钮 音乐
  • 解决win10运行Android Studio卡死问题

    问题 最近window来了一波强制更新 然后我发现在Android Studio内点运行 很容易就卡死在install处 完全不能动 只能在任务管理器上杀进程 用了很多办法都没解决 最后还是觉得是杀软的问题 处理了一下 解决办法 第一个办法
  • Python TimedRotatingFileHandler 多进程环境下的问题和解决方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题 Python 自带了一个 handler 可以实现每天自动切割日志文件的功能 其实支持各种按时间切割的方法 不过按日期切割是最常用的一种 切割 这件事的触发和执行逻辑
  • springboot在使用Scheduled做定时任务出现Autowired注入空指针

    错误示范 以往的依赖注入直接使用 Autowired Autowired BrowseRecordsService browseRecordsService ApiOperation 清除过期的浏览记录 public void remove
  • 【业务功能篇36】Springboot+activiti7 工作流引擎

    业务场景 前段时间总结的有一个告警工单流程 我们都是直接自己建表 状态节点 操作节点 都是自定义设计的 而到后面会有很多的工单流程 比如创建一个遗留问题电子流 指定处理人进行分析闭环 等等多种电子流 后期重复的开发工作以及维护工作会越来越多
  • C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】

    汉诺塔问题是我们在学习函数递归时常遇见的一类问题 那么如何用简单易懂的思路来解决汉诺塔问题呢 下面我会为大家进行讲解 目录 汉诺塔是什么 汉诺塔的来源 用C语言实现汉诺塔 汉诺塔问题分析思路 用代码实现汉诺塔问题 总结 汉诺塔是什么 汉诺塔
  • 1 ubuntu18 docker配置与安装 镜像加速配置

    0 背景 搭建环境到创建第一个容器 1 搭建环境 需求 1 安装docker环境 2 镜像加速站 3 多台主机安装docker 1 1 docker环境 电脑为老联想电脑 cpu 2 7ghz 内存12GB 用vmware搞了两个ubunt
  • NOIP2014 Day2 模拟赛赛后总结&题解

    考试时的心态 还能有什么心态 考炸了嘛 题解 第一题 无线电通讯 水题 直接模拟 就不多说了 第二题 图论水题 其实也挺水的 只要倒着来广搜一遍 把能到达的边标记一下就可以了 接下来从起点出发BFS一遍就可以了 但是我考试的时候没有想那么多
  • 现在网红里骗子占一半。

    大家好 我是北妈 0 每天和身边朋友还有读者交流 打工没有出路 几乎成为打工人的普遍共识 也有越来越多人尝试或已经在实践打造个人 IP 超级个体品牌这条路 我的星球桃花岛 还有群也很多人每天在交流怎么做个人ip或者视频自媒体 大家都很想破圈
  • C++ STL::list常用操作及底层实现(中2)——实现list常用操作之删除(erase、remove、pop_front、pop_back、clear)

    list 常用操作及自底层实现 1 erase 按链表迭代器删除 1 1函数格式1 iterator erase iterator position 1 2函数格式2 iterator erase iterator first iterat
  • 用TensorFlow编写训练模型的程序——快速导读

    1 训练模型是怎么回事 训练模型是指 通过程序的反复迭代来修正神经网络中各个节点的值 从而实现具有一定拟合效果的算法 在训练神经网络的过程中 数据流有两个方向 正向和反向 正向负责预测生成结果 沿着网络节点的运算方向一层层计算下去 反向负责
  • 如何高速安装jetson-inference,一步到位,避免踩坑!

    踩了很长时间的坑 终于弄明白怎么高速下载jetson inference 来源 安装jetson inference 自动下载模型 满速下载起飞 解决下载模型被墙问题 奈流云何的博客 CSDN博客 需要将Github的仓库复制到Gitee上
  • 使用stm32的ADC得到准确的电压

    一 引脚多一点的stm32单片机存在VREF 和VREF 引脚 由上面的供电图知道 如果存在VREF 和VREF 引脚 那么ADC是由这两个引脚供电的 ADC的采集电压范围为 VREF
  • 理解Vue插槽

    引言 在Vue开发中 我们多采用组件化开发 组件化开发最大特点就是对页面结构化划分 组件的复用 而在实际中 页面对组件的需求或许也稍有不同 那么就需要一种需求 为页面定制组件 解决的方式便是通过插槽 实例