Компонент Vue обязательно должен иметь один корневой элемент в следующих случаях:
Недопустимая структура:
<template>
<h1>Заголовок</h1>
<p>Текст параграфа</p>
</template>
Приведет к ошибке: Component template should contain exactly one root element
<template>
<div>
<h1>Заголовок</h1>
<p>Текст параграфа</p>
</div>
</template>
<template>
<fragment>
<h1>Заголовок</h1>
<p>Текст параграфа</p>
</fragment>
</template>
Vue 3 поддерживает компоненты с несколькими корневыми элементами (фрагменты), но с ограничениями:
<template>
<h1 v-bind="$attrs">Заголовок</h1>
<p>Текст параграфа</p>
</template>
<transition>
<div v-if="show">Контент</div>
</transition>
Компонент с одним корнем (работает везде):
<template>
<article class="card">
<header>
<h2>{{ title }}</h2>
</header>
<div class="content">
<slot></slot>
</div>
<footer v-if="$slots.footer">
<slot name="footer"></slot>
</footer>
</article>
</template>
Компонент-фрагмент (только Vue 3):
<template>
<h3>{{ title }}</h3>
<div class="content">
<slot></slot>
</div>
<button v-if="hasButton" @click="$emit('click')">
Кнопка
</button>
</template>
Один корневой элемент обязателен в Vue 2 и при работе с некоторыми функциями Vue 3. В Vue 3 можно использовать множественные корневые элементы, но это требует ручного управления атрибутами и подходит не для всех сценариев.