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

news2024/11/27 18:34:20

什么是 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.coloradmin.cn/o/742243.html

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

相关文章

【工具】浏览器自带下载加速功能

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

srt转rtmp(mpegts -> flv)

一、使用ffmpeg拉流srt转rtmp推流过程中遇到音视频问题 1、音频 虽然从mpegts到flv都是AAC格式&#xff0c;但是mpegts多了ADTS头&#xff0c;在flvenc的时候会报错误&#xff1a; Malformed AAC bitstream detected: use the audio bitstream filter aac_adtstoasc to fix it…

JAVA克隆

更多精彩 先案例后讲解&#xff0c;这里是代码教父&#xff0c;今天讲解JAVA中的clone 目录 什么是clone如何实现clone 浅克隆深克隆小结 什么时候使用cloneclone 相关类库的实现分析 什么是clone 在Java中&#xff0c;克隆&#xff08;Clone&#xff09;指的是创建一个现有对…

linux命令与shell编程

文章目录 一、概念linux内存嵌入式嵌入式层次图判断小端和大端 二、linux系统操作命令ls查看cd 命令pwd命令touch 创建文件mkdir 创建目录chmod 修改权限man命令cp 拷贝mv 移动rm命令cat命令echo 命令tty命令->查看当前终端号clear 命令ldd命令 ->查看文件依赖哪些库prin…

make makefile

文章目录 make是一个命令makefile or Makefile是一个当前目录下的文件使用&#xff1a;生成可执行文件清理 作用依赖关系依赖方法make会自动推导makefile中的依赖关系栈式结构为什么清理的时候要make 加上clean?make后面可以直接跟要生成的可执行文件,指定名称的依赖关系和依赖…

Python第二天之容器学习

1.List 容器无非就增删改查 1.添加 name_list [aaa,bbb,ccc,ddd] name_list.append(b1) name_list.insert(1,xxx) print(name_list)append 是在后面追加 而insert是自己定义下表插入 name_list [aaa,bbb,ccc,ddd] name_list2 [qqq,222,111] name_list.extend(name_list…

python 面向对象编程

文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 魔法方法__ init __() 方法__ str __()方法__ del __() 方法 前言 大家好&#xff0c;前面我们…

吐血整理,自动化测试Yaml框架配置文件-深入详解(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 YAML详解 YAML它…

上位机智能通信统一解决方案OPC应用

上位机应用开发中的通信需求 通信过程/通信协议多样性 通信统一化处理方案&#xff1a;OPC&#xff08;Open Platform Communications&#xff09;、OPC UA&#xff08;OPC Unified Architecture&#xff09; 基于西门子1500PLC的OPC服务器对接 internal class Program{stati…

BTP Integration Suite学习笔记 - (Unit1) Developing with SAP Integration Suite

今天决定跟着SAP官方资源系统学习一遍BTP Itegration Suite。找到两个Learning Journey: SAP Integration Suite Foundation 和 Solution Integration on SAP BTP。还有一个更大的roadmap,Integration Suite的官方内容在这里都可以链接到。 认证暂时只找到了一个比较基础的&…

干撸Spring,太难了!阿里P8级别「Spring源码全解析」带你起飞

有朋友跟我反映说&#xff0c;最近想详细学习Spring源码&#xff0c;可网上查到的文章都很一般&#xff0c;有没有大牛分享自己Spring实践与源码结合的方法&#xff1f; 干撸Spring&#xff0c;太难了&#xff01;难到你不知道从哪下手&#xff01; 为什么 Spring 天天用&…

云和DevOps如何帮助加速数字化转型?

1.云和 DevOps&#xff1a;概述 数字化转型已成为寻求在现代时代蓬勃发展的企业的一项关键举措。为了加速这一转型&#xff0c;组织正在利用云计算的力量并采用DevOps实践。云计算提供可扩展且灵活的基础架构&#xff0c;而 DevOps 则支持协作和持续交付的文化。本文将探讨云和…

ETHERCAT转PROFIBUS网关连接ethercat网线接口定义

远创智控YC-DP-ECT&#xff0c;是自主研发的一款PROFIBUS从站功能的通讯网关&#xff0c;它的主要功能是将ETHERCAT设备接入到PROFIBUS网络中。 YC-DP-ECT这个小小的网关可不简单&#xff0c; 连接到PROFIBUS总线中做为从站使用&#xff0c;连接到ETHERCAT总线中做为从站使用…

实现企业安全云转型的思考

如今大部分企业都在开展数字化数字化转型&#xff0c;云计算一直在其中起着主导地位&#xff0c;因而组织面临着双重挑战&#xff1a;如何将业务无缝迁移至云上&#xff0c;并确保这种转型的安全。 虽然云的使用保证了可扩展性、成本效率和生产力的提高&#xff0c;但上云过程…

【C++顺序容器】deque的成员函数和非成员函数

目录 deque 1. deque的成员函数 1.1 构造、析构和赋值运算符重载 1.1.1 构造函数 1.1.2 析构函数 1.1.3 赋值运算符重载 1.2 迭代器 1.3 容量 1.4 元素访问 1.4.1 遍历方法 1.5 修改器 1.6 空间配置器 2. deque的非成员函数 deque deque&#xff08;通常发音为 &…

告别VLAN孤岛,两招让你轻松实现互访

实际网络中&#xff0c;经常会有VLAN之间互访的需求。 很多网工通常会选择一些方法&#xff0c;来实现不同VLAN间主机的相互访问&#xff0c;比如说Vlanif、单臂路由。 今天就教你轻松实现VLAN间互访。 01-通过子接口实现 VLAN 间的互访 在二层交换环境下&#xff0c;一个VLA…

线程是什么

目录 一、教材观点 二、简述进程是如何运行的 简述进程切换原理&#xff1a; 三、线程是什么 线程底层是如何被管理的 四、重讲线程概念理解 一、教材观点 教材观点&#xff1a; 线程是一个执行分支&#xff0c;执行分支更细&#xff0c;调度成本更低。线程是进程内部的…

Android SystemServer 启动流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、SystemServer 启动的服务有哪些二、SystemServer启动总体流程概述三、SystemServer 如何启动&#xff0c;是谁启动的&#xff1f;四、 SystemServe…

解决哈希冲突

1、HashMap引入了链式寻址法来解决hash冲突&#xff0c;冲突的key&#xff0c;HashMap把这些key组成一个单向链表&#xff0c;然后采用尾插法把key保存到链表的尾部。 使用二次扰动函数&#xff08;hash函数&#xff09;来降低哈希冲突的概率&#xff0c;使数据平均分布。 pu…

【VUE】Unterminated template literal:拼接字符串包括<script></script>时报错误

vue拼接字符串包括时报错误提示Unterminated template literal vue拼接字符串包括script标签时报错误提示Unterminated template literal解决方法加反斜杠就可以&#xff0c;在script结束标签里边加反斜杠<\/script> 代码 htmlData: <div id"b0e5c00cc51e4a4…