You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue 3中首个自闭合组件之后添加的组件为何无法正常渲染

Vue DOM内模板使用自闭合自定义组件导致后续内容无法渲染问题说明

根因分析

  • 该问题与Vue 2/3版本无关,核心是DOM内模板的解析规则限制:HTML原生规范仅支持<img>、<input>、<br>这类官方定义的空元素使用自闭合写法,自定义标签的自闭合写法不会被浏览器原生HTML解析器识别。
  • 你在HTML页面内直接写的<counter :count="2" />会被浏览器解析为未闭合的开标签<counter :count="2">,后续所有DOM内容都会被识别为该组件的子节点,由于你定义的Counter组件没有预留<slot>插槽渲染子内容,因此后续的第三个counter组件、换行标签等内容全部不会被渲染。

解决方案

  • DOM内模板(直接写在.html文件中挂载节点内的模板)中所有自定义组件必须使用完整闭合标签,将<counter :count="2" />修改为<counter :count="2"></counter>即可正常渲染所有组件。
  • 如果你使用Vue单文件组件(.vue)、或组件内字符串模板(即组件选项中template属性定义的模板),则不受该限制,可正常使用自闭合自定义组件写法,因为这两类模板由Vue自身解析,不会经过浏览器原生HTML解析的预处理。

修正后代码示例

JS部分

let Counter = {
    props: {
        count: {
            type: Number,
            required: true 
        }
    },
    template: `
        <span>{{ count }}</span>
    `
}
const app = Vue.createApp({
    components: {
        'counter': Counter
    },
});

const vm = app.mount("#app");

HTML部分

<script src="https://unpkg.com/vue@next"></script>
<div id="app">
    <counter :count="1"></counter>
    <br />
    <counter :count="2"></counter>
    <br />
    <counter :count="3"></counter>
</div>

内容的提问来源于stack exchange,提问作者Sachin Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:09:02