Vue3 插槽系统详解

Vue3 插槽系统详解

1. 默认插槽

重点掌握:

  • 插槽的基本概念
  • 默认插槽的使用方法
  • 后备内容的设置

示例代码:

<!-- BaseCard.vue -->
<template><div class="card"><div class="card-header"><!-- 后备内容 --><slot>默认内容</slot></div></div>
</template><!-- 使用组件 -->
<template><div><!-- 使用默认插槽 --><BaseCard><h2>这是插入到插槽的内容</h2><p>可以插入任意内容</p></BaseCard><!-- 不提供内容时使用后备内容 --><BaseCard /></div>
</template>

2. 具名插槽

重点掌握:

  • 多个插槽的命名
  • v-slot 指令的使用
  • 插槽缩写语法 #

示例代码:

<!-- LayoutComponent.vue -->
<template><div class="layout"><header><slot name="header"></slot></header><main><slot></slot>  <!-- 默认插槽 --></main><footer><slot name="footer"></slot></footer></div>
</template><!-- 使用组件 -->
<template><LayoutComponent><!-- 具名插槽使用 --><template v-slot:header><h1>网站标题</h1></template><!-- 默认插槽内容 --><template v-slot:default><p>主要内容区域</p></template><!-- 缩写语法 --><template #footer><p>版权信息 © 2024</p></template></LayoutComponent>
</template>

3. 作用域插槽

重点掌握:

  • 插槽数据传递
  • 解构插槽 props
  • 多个作用域插槽的使用

示例代码:

<!-- DataList.vue -->
<template><div><ul><li v-for="item in items" :key="item.id"><slot name="item" :item="item":index="index":isSelected="selectedId === item.id"><!-- 默认渲染 -->{{ item.name }}</slot></li></ul></div>
</template><script setup>
const props = defineProps({items: {type: Array,required: true}
})const selectedId = ref(null)
</script><!-- 使用组件 -->
<template><DataList :items="users"><!-- 基本用法 --><template v-slot:item="slotProps"><div class="user-item">{{ slotProps.item.name }} ({{ slotProps.index }})</div></template><!-- 使用解构 --><template #item="{ item, index, isSelected }"><div class="user-item" :class="{ 'selected': isSelected }"><h3>{{ item.name }}</h3><p>Position: {{ index + 1 }}</p></div></template></DataList>
</template><!-- 高级用法:表格组件 -->
<template><Table :data="users"><!-- 定义列的渲染方式 --><template #column="{ row }"><td>{{ row.name }}</td></template><!-- 自定义操作列 --><template #actions="{ row }"><button @click="editUser(row)">编辑</button><button @click="deleteUser(row)">删除</button></template></Table>
</template><!-- 实际应用示例:可复用的表单项组件 -->
<!-- FormField.vue -->
<template><div class="form-field"><label :for="id">{{ label }}</label><slot :id="id":value="modelValue":error="error":updateValue="updateValue"></slot><span class="error">{{ error }}</span></div>
</template><!-- 使用表单项组件 -->
<template><form @submit.prevent="onSubmit"><!-- 文本输入 --><FormFieldlabel="用户名"v-model="form.username"><template #default="{ id, value, updateValue, error }"><input:id="id"type="text":value="value"@input="updateValue($event.target.value)":class="{ 'has-error': error }"/></template></FormField><!-- 下拉选择 --><FormFieldlabel="角色"v-model="form.role"><template #default="{ id, value, updateValue }"><select:id="id":value="value"@change="updateValue($event.target.value)"><option value="admin">管理员</option><option value="user">普通用户</option></select></template></FormField></form>
</template>

4. 插槽最佳实践

重点掌握:

  1. 合理使用默认内容
  2. 插槽 props 的类型定义
  3. 动态插槽名的使用
  4. 性能注意事项

TypeScript 类型定义:

// 定义插槽 props 的类型
type ItemSlotProps = {item: {id: numbername: string[key: string]: any}index: numberisSelected: boolean
}// 组件定义
defineComponent({name: 'DataList',props: {items: {type: Array as PropType<ItemSlotProps['item'][]>,required: true}}
})// 动态插槽名使用
<template><div><slot :name="`column-${columnName}`" v-bind="columnData"></div>
</template>

性能优化:

<!-- 避免不必要的插槽更新 -->
<template><div><slot name="item":item="item"<!-- 使用 memo 避免不必要的更新 -->:memoData="memo(() => expensiveComputation(item))"></slot></div>
</template><script setup>
import { memo } from 'vue'// 缓存计算结果
const memoizedData = memo(() => {return expensiveComputation()
})
</script>

这部分内容详细介绍了Vue3中的三种插槽类型:

  1. 默认插槽:最基本的内容分发机制
  2. 具名插槽:通过名字指定内容放置位置
  3. 作用域插槽:允许子组件向父组件传递数据

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

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

相关文章

第一性原理:游戏开发成本的思考

利润 营收-成本 营收定价x销量x分成比例 销量 曝光量x 点击率x &#xff08;购买率- 退款率&#xff09; 分成比例 100%- 平台抽成- 税- 引擎费- 发行抽成 成本开发成本运营成本 开发成本 人工外包办公地点租金水电设备折旧 人工成本设计成本开发成本迭代修改成本后续内容…

Hot100之矩阵

73矩阵置零 题目 思路解析 收集0位置所在的行和列 然后该行全部初始化为0 该列全部初始化为0 代码 class Solution {public void setZeroes(int[][] matrix) {int m matrix.length;int n matrix[0].length;List<Integer> list1 new ArrayList<>();List<…

详解分布式锁

目录 基于MYSQL实现 通过 insert 实现 通过 select 实现 基于Redis实现 基于set实现 redlock 基于zookeeper实现 在分布式系统中对于共享资源我们需要确保在任何时刻只有一个节点或进程能够访问&#xff0c;也就需要加锁&#xff0c;而我们的本地锁无法满足这个需求&…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…

物业管理系统源码提升社区智能化管理效率与用户体验

内容概要 物业管理系统源码是一种针对社区管理需求而设计的软件解决方案&#xff0c;通过先进的智能化技术&#xff0c;使物业管理变得更加高效和人性化。随着城市化进程的加快&#xff0c;社区的管理复杂性不断增加&#xff0c;而这一系统的推出恰好为物业公司提供了极大的便…

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…

院校联合以项目驱动联合培养医工计算机AI人才路径探析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下&#xff0c;医疗人工智能作为一个极具潜力的新兴领域&#xff0c;正深刻地改变着传统医疗模式。从疾病的早期诊断、个性化治疗方案的制定&#xff0c;到药物研发的加速&#xff0c;人工智能技术的应用极大地提升了医疗服务…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象

2.18 对象数组&#xff1a;在NumPy中存储Python对象 目录 #mermaid-svg-shERrGOBuM2rBzeB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shERrGOBuM2rBzeB .error-icon{fill:#552222;}#mermaid-svg-shERrGOBuM2rB…

响应式编程与协程

响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程&#xff0c;它更多的使用少量线程实现线程间解耦和异步的作用&#xff0c;如线程的Reactor模型&#xff0c;主要…

python学opencv|读取图像(五十三)原理探索:使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习进程中&#xff0c;已经探索了使用cv.matchTemplate()函数实现最佳图像匹配的技巧&#xff0c;并且成功对两个目标进行了匹配。 相关文章链接为&#xff1a;python学opencv|读取图像&#xff08;五十二&#xff09;使用cv.matchTemplate()函数实现最佳图像…

javaEE-8.JVM(八股文系列)

目录 一.简介 二.JVM中的内存划分 JVM的内存划分图: 堆区:​编辑 栈区:​编辑 程序计数器&#xff1a;​编辑 元数据区&#xff1a;​编辑 经典笔试题&#xff1a; 三,JVM的类加载机制 1.加载: 2.验证: 3.准备: 4.解析: 5.初始化: 双亲委派模型 概念: JVM的类加…

【01】共识机制

BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒&#xff0c;却要保证进攻一致&#xff0c;由此引申到计算领域&#xff0c;发展成了一种容错理论。随着…

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型&#xff0c;用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说&#xff0c;N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意&#xff1a;这…

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架&#xff1a;framework&#xff0c;为了解决一类事情的功能集合 UnitTest框架&#xff1a;是python自带的单元测试框架 自带的&#xff0c;可以直接使用&#xff0c;不需要格外安装 测试人员用来做自动化测试&#xff0c;作…

【数据结构】_链表经典算法OJ:复杂链表的复制

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;…

Linux——进程间通信之SystemV共享内存

前言 SystemV通信一般包括三种&#xff1a;共享内存、消息队列和信号量。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到 内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来…

Linux网络 | 网络层IP报文解析、认识网段划分与IP地址

前言&#xff1a;本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外&#xff0c; 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说&#xff0c; 开始我们的学习吧&#xff01;&#xff01; ps&#xff1a;本节正式进入网络层喽&#xff0c; 友友们…

SQLGlot:用SQLGlot解析SQL

几十年来&#xff0c;结构化查询语言&#xff08;SQL&#xff09;一直是与数据库交互的实际语言。在一段时间内&#xff0c;不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格&#xff0c;也就是方言。这可能是SQL被广泛采用和流行的原因之一。 SQL解析是解构SQL查询…