如何使用 Vue 命名插槽创建多个模板插槽?

B站UP主
• 阅读 4966
作者:Matt Maribojoc
译者:前端小智
来源:stackabuse

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

Vue 插槽允许将父组件中的内容注入到子组件中。

这是最基本的示例,如果我们不提供父级的任何slot 内容,则我们将<slot>放在其中的任何内容都会作为后备内容。

// ChildComponent.vue
<template>
  <div>
     <slot> 后备内容 </slot>
  </div>
</template>

你组件代码:

// ParentComponent.vue
<template>
   <child-component>
      替换 slot 的默认内容
   </child-component>
</template>

编译后,我们的 DOM 将如下所示

<div> 替换 slot 的默认内容 </div>

我们还可以将父组作用域内的任何数据写在 slot 区域中。 例如,父组件有一个名为title的数据字段,我们可以使用以下代码将其注入到子组件中:

// ParentComponent.vue

<template>
   <child-component>
      {{ title }} 
   </child-component>
</template>

<script>
export default {
   data () {
     return {
       title: '这会传递给子组件',
     }
   }
}
</script>

为什么我们需要命名插槽

在Vue中使用命名插槽有两个步骤:

  1. 使用name属性从子组件中命名 slot
  2. 使用v-slot指令从父组件向这些命名插槽提供内容

默认情况下,不给插槽显式的name属性时,它有默认名字是default

为了给我们的 slot 起个名字,<slot>元素具有一个特殊的name属性,可以让我们在多个插槽之间进行区分。

在下面的 Article.vue 中,我们命名三个 slot

// Article.vue - Child Component
<template>
  <div>
    <slot name="title"> 默认 title </slot>
    <slot name="content"> 默认 content </slot>
    <slot name="comments"> 默认 comments</slot>
  </div>
</template>

然后,在父组件中,我们可以在<template>元素上使用v-slot指令指定我们想要注入内容的slot

// ParentComponent.vue
<template>
  <div>
    <child-component>
      <template> 我的 Title </template>
      <template> 我的 Content </template>
      <template> 我的 Comments </template>
    </child-component>
  </div>
</template>

因为这是没有指定 slot 的名称,所以显示的是 slot 默认的内容。

如何使用 Vue 命名插槽创建多个模板插槽?

要解决这个问题,可以使用v-slot,指定的名称要确保名称与我们在子组件中声明的名称完全匹配。

<template>
  <div>
    <child-component>
      <template v-slot:title> 我的 title </template>
      <template v-slot:content> 我的 content </template>
      <template v-slot:comments> 我的 comments </template>
    </child-component>
  </div>
</template>

再次运行:

如何使用 Vue 命名插槽创建多个模板插槽?

使用 Vue 命名插槽有什么意义

命名槽让我们可以使用多个槽,但是为什么这对我们Vue开发人员有用呢。

简而言之,它使我们可以更好地组织开发代码,还可以编写更具扩展性的代码。

就个人而言,我认为最重要的是,它允许我们在代码上使用插槽,从而使样式设计变得更加容易。 在我们的示例中,Article.vue子组件只有三个插槽,但是在实际应用中,这些插槽看起来更像这样,以便我们的组件可以向每个部分添加CSS样式。

<template>
  <div>
    <div class="title">
      <h1>
        <slot name="title"> 默认 Title </slot>
      </h1>
    </div>
    <div class="content">
      <p>
        <slot name="content"> 默认  Content </slot>
      </p>
    </div>
    <div class="comments">
      <slot name="comments"> 默认  Comments </slot>
    </div>
  </div>
</template>

在此示例中,更容易理解为什么我们需要多个 slot。 由于我们注入的内容是通过不同的<div><p>和DOM元素彼此分隔的。 无法在一个slot中传递所有这些信息。

如何使用 Vue 命名插槽创建多个模板插槽?

如果检查DOM,可以看到使用v-slot的模板将内容正确地插入到正确的位置。

如何使用 Vue 命名插槽创建多个模板插槽?

~完,我是刷碗智,去刷碗了,下期见!


代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug

原文:
https://learn.co/2021/04/usin...

交流

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq44924588... 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

如何使用 Vue 命名插槽创建多个模板插槽?

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
巴拉米 巴拉米
4年前
7个关于"this"面试题,你能回答上来吗?
作者:Shadeed译者:前端小智来源:dmitripavlutin点赞再看,微信搜索【大迁世界(https://mp.weixin.qq.com/s/sY9ufGGKfcdaAQ7KJQs3HA)】,B站关注【前端小智(https://space.bilibili.com/31089477)】这个没有大厂背景,但有着一股向上积
巴拉米 巴拉米
4年前
金三银四了,掌握 JS 这 36 个概念,助你一臂之力
作者:MahdhiRezvi译者:前端小智来源:dmitripavlutin点赞再看,微信搜索【大迁世界(https://mp.weixin.qq.com/s/sY9ufGGKfcdaAQ7KJQs3HA)】,B站关注【前端小智(https://space.bilibili.com/31089477)】这个没有大厂背景,但有着
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java 9版本之后Base64Encoder和Base64Decoder无法继续使用解决办法
<divclass"htmledit\_views"id"content\_views"<p在项目开发过程中,因为重装系统,安装了Java10版本,发现sun.misc.Base64Encoder和sun.misc.Base64Decoder无法使用。</p<p<br</p<p<strong原因:</strong</p<p查看
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
可莉 可莉
3年前
10个很棒的 JavaScript 字符串技巧
作者:Kai译者:前端小智来源:dev点赞再看,微信搜索【大迁世界】关注这个没有大厂背景,但有着一股向上积极心态人。本文GitHubhttps://github.com/qq44924588...(https://www.oschina.net/action/GoToLink?urlhttps%
可莉 可莉
3年前
13 个 JavaScript 数组精简技巧
作者:Duomly译者:前端小智来源:dev.to点赞再看,微信搜索【大迁世界】关注这个没有大厂背景,但有着一股向上积极心态人。本文GitHubhttps://github.com/qq44924588...(https://www.oschina.net/action/GoToL
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
B站UP主
B站UP主
Lv1
山水总相逢,来日皆可期。
文章
3
粉丝
0
获赞
0