出现 Extraneous children found when component already has explicitly named default slot 原理分析

前言

由于此类Bug比较简易简单,特此放置在前端专栏,主要是为了分析此类Bug的原理

1. 原理分析

在 Vue 3 中,插槽(slots)是组件中用于分发内容的机制,推荐阅读:详细分析Vue3中的卡槽知识点(附Demo)

插槽有默认插槽和具名插槽两种
在渲染组件时,Vue 期望插槽内容符合定义,如果组件中已经明确指定了“默认插槽”,并且你还传递了额外的子元素,那么 Vue 会报 Extraneous children found when component already has explicitly named default slot 错误,提示已经存在了默认插槽,不再接受其他多余的子内容

2. 解决方法

Demo 示例

以一个简单的 MyComponent 组件为例,该组件定义了具名插槽:

<template>
  <div>
    <slot name="header"></slot>
    <div class="content">
      <slot></slot> <!-- 默认插槽 -->
    </div>
    <slot name="footer"></slot>
  </div>
</template>

使用错误的情况:

在使用该组件时,如果传递了错误的子内容,比如:

<MyComponent>
  <h1>Title</h1> <!-- 默认插槽的内容 -->
  <p>This is the main content</p>
  <footer>Footer content</footer>
</MyComponent>

因为 MyComponent 中已经定义了具名插槽 header 和 footer,但传递的 <h1><footer> 并没有放到具名插槽中,而是作为默认插槽的内容,Vue 会报错:Extraneous children found when component already has explicitly named default slot,并忽略这些内容

解决方案
要解决这个问题,需要确保插槽内容正确地传递到具名插槽中:

<MyComponent>
  <template #header>
    <h1>Title</h1>
  </template>
  <template #default>
    <p>This is the main content</p>
  </template>
  <template #footer>
    <footer>Footer content</footer>
  </template>
</MyComponent>

在此示例中,<h1> 放在了 #header 具名插槽中,<p> 放在了默认插槽中,<footer> 放在了 #footer 具名插槽中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值