Vue 3 报错 Invalid vnode type when creating vnode: undefined

发生背景

用 Nuxt3 正常写 SFC。

相关代码

<script lang="ts" setup>

import { Message } from '@arco-design/web-vue';
import { GuildCredit } from '...';

// ...

const data: Ref<GuildCredit[]> = ref([]); // Nuxt3 自动导入 Vue API

//...

function handleAdd() {
  // ...
  Message.success('添加成功');
}

onMounted(async () => {
  // ...
});

<template>

<!-- Nuxt3 同样自动导入一些组件。 -->
<AList :data='data'>
  <template #item='{ index }'> <!-- index 是当前渲染的元素下标 -->
    <AListItem>
      <GuildCredit v-model='data[index]' /> <!-- 业务组件 -->
    </AListItem>
  </template>
</AList>

报错信息

[Vue warn]: Invalid vnode type when creating vnode: undefined.
  at <ListItem>
  at <Scrollbar ... >
  at <Spin ... >
  at <List ... >
  at ...

解决方案

<script lang="ts" setup> 中:

- import { GuildCredit } from '...';
+ import type { GuildCredit } from '...';

发生原因

Nuxt3 自动导入组件 GuildCredit,但我显式导入了一个 interface GuildCredit,所以自动导入被覆盖了。

而 TS 的 interface 编译成 JS 后就删除了,导致 GuildCredit 不存在了,取到 undefined。等价于:

<component :is='undefined' v-model='data[index]' />

显然,会报错。

所以,这个问题的根源在于命名冲突

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值