【Vue3 第十九章】插槽 slot

这篇具有很好参考价值的文章主要介绍了【Vue3 第十九章】插槽 slot。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

概述

在某些场景中,我们可能想要为子组件传递一些模板片段,让子组件在它们的组件中渲染这些片段。这就用到了插槽。

插槽是子组件中的提供给父组件使用的一个占位符,用 <slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot> 元素。<slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。

vue3 动态slot,Vue,前端,vue.js,前端框架

一、匿名插槽

子组件 FancyButton 中插槽模板

# 基础用法
<button class="fancy-btn">
	<!-- 插槽出口 -->
	<slot></slot> 
</button>

# 可指定默认插槽内容:父组件没有提供任何插槽内容时,默认渲染的插槽内容 Submit
<button class="fancy-btn">
	<slot>Submit</slot> 
</button>

父组件填充插槽内容

<FancyButton>
	<!-- 插槽内容 -->
	<div>Click me!</div>
</FancyButton>

# 或

<FancyButton>
	<!-- 插槽内容 -->
	 <template v-slot>
       <div>Click Me</div>
    </template>
</FancyButton>

最终渲染出的 DOM 结构如下

<button class="fancy-btn">Click me!</button>

通过使用插槽,使组件更加灵活和具有可复用性。这样组件可以用在不同的地方渲染各异的内容,但同时还保证都具有相同的样式。

二、具名插槽 (named slots)

具名插槽其实就是给插槽取个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中。

对于这种场景,<slot> 元素可以有一个特殊的属性 name,用来给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:

  • 子组件预留的插槽

    <div class="container">
        <header>
        	<slot name="header"></slot>
        </header>
        <main>
        	<-- 没有提供 name 的 slot 出口会隐式地命名为 “default” -->
        	<slot></slot>
        </main>
        <footer>
        	<slot name="footer"></slot>
        </footer>
    </div>
    
  • 父组件对指定插槽进行填充

    要为具名插槽传入内容,我们需要使用一个含 v-slot 指令的 <template> 元素,并将目标插槽的名字传给该指令。

    <BaseLayout>
        <template v-slot:header>
           <div>header</div>
        </template>
        <template v-slot>
           <div>default</div>
        </template>
        <template v-slot:footer>
           <div>footer</div>
        </template>
    </BaseLayout>
    
  • v-slot 语法糖(简写方式)

    v-slot 有对应的简写 #,因此 <template v-slot:header> 可以简写为 <template #header>。其意思就是“将这部分模板片段传入子组件的 header 插槽中”。

vue3 动态slot,Vue,前端,vue.js,前端框架

<BaseLayout>
    <template #header>
    	<h1>Here might be a page title</h1>
    </template>

    <template #default>
    	<p>A paragraph for the main content.</p>
    	<p>And another one.</p>
    </template>

    <template #footer>
    	<p>Here's some contact info</p>
    </template>
</BaseLayout>

# 或

# 当一个组件同时接收默认插槽和具名插槽时,所有位于顶级的非 <template> 节点都被隐式地视为默认插槽的内容。所以上面也可以写成:
<BaseLayout>
    <template #header>
    	<h1>Here might be a page title</h1>
    </template>

    <!-- 隐式的默认插槽 -->
    <p>A paragraph for the main content.</p>
    <p>And another one.</p>

    <template #footer>
    	<p>Here's some contact info</p>
    </template>
</BaseLayout>

现在 <template> 元素中的所有内容都将被传递到相应的插槽。最终渲染出的 HTML 如下:

<div class="container">
    <header>
    	<h1>Here might be a page title</h1>
    </header>
    
    <main>
    	<p>A paragraph for the main content.</p>
    	<p>And another one.</p>
    </main>
    
    <footer>
    	<p>Here's some contact info</p>
    </footer>
</div>

三、动态插槽

动态指令参数在 v-slot 上也是有效的,即可以通过变量定义动态插槽名:

<script setup>
	import { ref } from "vue";
	const name = ref('header')
</script>
<template>
	<base-layout>
		<template v-slot:[name]>
            <div>动态插槽</div>
        </template>
	
		 <!-- 缩写为 -->
        <template #[name]>
            <div>动态插槽</div>
        </template>
    </base-layout>
</temppate>

四、作用域插槽

在某些场景下插槽的内容可能想要同时使用父组件域内和子组件域内的数据。可以使用属性绑定的方式向一个插槽的出口上传递数据,称为插槽 props 。

4.1 匿名插槽数据传递

子组件 MyComponent传递插槽 props

<div>
  <slot :text="greetingMessage" :count="1"></slot>
</div>  

父组件接收插槽 props:默认插槽通过子组件标签上的 v-slot 指令,直接接收到了一个插槽 props 对象

<MyComponent v-slot="slotProps">
	{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>

# 或 在 v-slot 中使用解构语法
<MyComponent v-slot="{ text, count }">
	{{ text }} {{ count }}
</MyComponent>

vue3 动态slot,Vue,前端,vue.js,前端框架

4.2 具名插槽数据传递

具名作用域插槽的工作方式也是类似的,插槽 props 可以作为 v-slot 指令的值被访问到:v-slot:name="slotProps"

<slot name="header" message="hello"></slot>
<MyComponent>
  <template #header="headerProps">
    {{ headerProps }}
  </template>

  <template #default="defaultProps">
    {{ defaultProps }}
  </template>

  <template #footer="footerProps">
    {{ footerProps }}
  </template>
</MyComponent>

4.3 作用域插槽应用场景:高级列表组件示例

你可能想问什么样的场景才适合用到作用域插槽,这里我们来看一个 <FancyList> 组件的例子。它会渲染一个列表,并同时会封装一些加载远端数据的逻辑、使用数据进行列表渲染、或者是像分页或无限滚动这样更进阶的功能。然而我们希望它能够保留足够的灵活性,将对单个列表元素内容和样式的控制权留给使用它的父组件。我们期望的用法可能是这样的:

<FancyList :api-url="url" :per-page="10">
    <template #item="{ body, username, likes }">
        <div class="item">
          <p>{{ body }}</p>
          <p>by {{ username }} | {{ likes }} likes</p>
        </div>
    </template>
</FancyList>

<FancyList> 之中,我们可以多次渲染 <slot> 并每次都提供不同的数据 (注意我们这里使用了 v-bind 来传递插槽的 props):

<ul>
  <li v-for="item in items">
    <slot name="item" v-bind="item"></slot>
  </li>
</ul>

上面的 <FancyList> 案例同时封装了可重用的逻辑 (数据获取、分页等) 和视图输出,但也将部分视图输出通过作用域插槽交给了消费者组件来管理。

如果我们将这个概念拓展一下,可以想象的是,一些组件可能只包括了逻辑而不需要自己渲染内容,视图输出通过作用域插槽全权交给了消费者组件。我们将这种类型的组件称为无渲染组件

这里有一个无渲染组件的例子,一个封装了追踪当前鼠标位置逻辑的组件:

<MouseTracker v-slot="{ x, y }">
	Mouse is at: {{ x }}, {{ y }}
</MouseTracker>

虽然这个模式很有趣,但大部分能用无渲染组件实现的功能都可以通过组合式 API 以另一种更高效的方式实现,并且还不会带来额外组件嵌套的开销。
尽管如此,作用域插槽在需要同时封装逻辑、组合视图界面时还是很有用,就像上面的 <FancyList> 组件那样。文章来源地址https://www.toymoban.com/news/detail-700304.html

到了这里,关于【Vue3 第十九章】插槽 slot的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十九章:Linux中安装MySQL

    查看是否安装过 MySQL MySQL 卸载 关闭 ,ysql 服务 查询当前 mysql 安装状态 卸载上述命令【任意一条就行】查询出的已安装程序 注意:务必卸载干净,反复执行 rpm -qa | grep -i mysql 确认是否有卸载残留。 删除 mysql 相关文件 删除 my.cnf 【 MySQL 的配置文件】 检查 /tmp 临时目录权限

    2024年02月13日
    浏览(44)
  • 信安软考 第十九章 操作系统安全保护

    一、操作系统安全概述 1.1 操作系统安全概念与需求 操作系统(operating system),以下都简称OS 操作系统 负责计算机系统的资源管理,支撑和控制各种应用程序运行,为用户提供计算机系统管理接口 。操作系统是构成信息网络系统的核心关键组件,其安全可靠程度决定了计算

    2024年02月06日
    浏览(44)
  • 【Rust】Rust学习 第十九章高级特征

    现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们,我们

    2024年02月11日
    浏览(44)
  • TCP/IP网络编程 第十九章:Windows平台下线程的使用

    要想掌握Windows平台下的线程,应首先理解“内核对象”(Kernel Objects)的概念。如果仅介绍Windows平台下的线程使用技巧,则可以省略相对陌生的内核对象相关内容。但这并不能使各位深入理解Windows平台下的线程。 内核对象的定义 操作系统创建的资源有很多种,如进程、线程

    2024年02月16日
    浏览(54)
  • 【Linux命令行与Shell脚本编程】第十九章 正则表达式

    正则表达式基础 定义BRE模式 扩展正则表达式 在sed和gawk中创建正则表达式,以得到所需的数据。 正则表达式是一种可供Linux工具过滤文本的自定义模板,使用元字符来描述数据流中的一个或多个字符. Linux工具(比如sed或gawk)会在读取数据时使用正则表达式对数据进行模式匹配

    2024年02月13日
    浏览(57)
  • Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

    讲解本章先从一张图开始 众所周知,Java类的相关信息都是存储在元空间中的,但是是怎么存储的,相信很多读者是不清楚的,这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData(简称CLD)和Klass的概念及他们四者的关系,这里简单描述下他们的概念,具体细节放到

    2024年01月17日
    浏览(47)
  • 第十九章 调用Callout Library函数 - 将 $ZF(-5) 与多个库和许多函数调用一起使用

    对 $ZF(-4,1) 的调用将标注库 inputlibrary.dll 和 outputlibrary.dll 加载到虚拟内存中,并为其返回系统定义的库 ID 。 对 $ZF(-4,3) 的调用使用库 ID 和函数名称来获取库函数的 ID 。返回的函数 ID 实际上是 ZFEntry 表序列号(请参阅上一章中的“创建 ZFEntry 表”)。 第一个循环使用 $ZF(-5

    2024年01月16日
    浏览(45)
  • 【vue2第十四章】 插槽(普通插槽、具名插槽、作用域插槽语法)

    插槽是什么? 在 Vue 2 中,插槽(slot)是一种用于定义组件内部内容分发的机制。它允许你将组件中的一部分内容替换为用户自定义的内容,并在组件内部进行渲染。 通过在组件模板中使用 slot/slot 标签,你可以指定一个插槽的位置。这个位置可以被父组件中的任意内容所填

    2024年02月09日
    浏览(32)
  • vue 3 第二十九章:路由管理(Vue Router4.x基础知识)

    Vue Router 是 Vue.js 官方的 路由管理器 。它和 Vue.js 的 核心 深度集成,可以轻松地 构建单页面应用程序 。Vue Router 允许我们在应用程序中 定义路由 ,然后根据 URL 来 匹配路由 ,并 渲染对应的组件 。 Vue Router 的核心概念包括 路由 、 路由器 、 路由视图 和 导航守卫 。 路由

    2024年02月07日
    浏览(35)
  • 算法通关第十九关-青铜挑战理解动态规划

    大家好我是苏麟 , 今天聊聊动态规划 . 动态规划是最热门、最重要的算法思想之一,在面试中大量出现,而且题目整体都偏难一些对于大部人来说,最大的问题是不知道动态规划到底是怎么回事。很多人看教程等,都被里面的状态子问题、状态转移方程等等劝退了。 其实,所

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包