В Vue.js начиная с версии 3 появилась возможность использовать
множественные корневые элементы в шаблонах компонентов.
Ранее каждый компонент должен был иметь единственный корневой
элемент, что иногда приводило к необходимости оборачивать
содержимое в лишние <div> или другие контейнеры.
Новая концепция Fragments устраняет эти ограничения,
позволяя компоненту возвращать сразу несколько элементов на верхнем
уровне.
Fragment — это виртуальный контейнер, который не рендерится в DOM. Он позволяет группе элементов существовать как единое целое на уровне виртуального DOM, сохраняя при этом структуру без лишних обёрток.
Пример компонента с множественными корневыми элементами:
<template>
<header>
<h1>Заголовок страницы</h1>
</header>
<main>
<p>Основное содержимое</p>
</main>
<footer>
<p>Подвал сайта</p>
</footer>
</template>
<script>
export default {
name: "PageLayout"
};
</script>
В этом примере компонент PageLayout возвращает
три корневых элемента: <header>,
<main> и <footer>. Vue.js
корректно обработает их без необходимости добавлять дополнительный
контейнер.
<template>
<section>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</section>
</template>
Реактивность и Fragments Каждый корневой элемент в Fragment является реактивным, как если бы он был единственным корневым элементом. Изменения в состоянии компонента автоматически отражаются на всех элементах.
Взаимодействие с директивами Директивы Vue,
такие как v-if, v-for и v-show,
работают с каждым элементом внутри Fragment индивидуально. Это позволяет
гибко управлять отображением и повторением элементов без лишних
обёрток.
<template>
<div v-if="showHeader">Заголовок</div>
<div v-if="showMain">Основной контент</div>
</template>
<TransitionGroup> вместо обычного
<Transition>.ref на компонент с
Fragment будет ссылаться на сам компонент, но не на отдельные
DOM-элементы. Для доступа к отдельным элементам внутри нужно
использовать ref на этих элементах.<template>
<div ref="header">Заголовок</div>
<div ref="main">Основной контент</div>
</template>
<script>
import { ref, onMounted } from "vue";
export default {
setup() {
const header = ref(null);
const main = ref(null);
onMounted(() => {
console.log(header.value); // <div>Заголовок</div>
console.log(main.value); // <div>Основной контент</div>
});
return { header, main };
}
};
</script>
Функциональные компоненты в Vue.js идеально подходят для возврата нескольких элементов без состояния. Они часто используются для простых UI-компонентов, где не требуется реактивность.
Пример функционального компонента:
<script setup>
const MyFunctionalComponent = () => {
return [
<li>Элемент 1</li>,
<li>Элемент 2</li>,
<li>Элемент 3</li>
];
};
</script>
Такой компонент возвращает массив элементов, который Vue автоматически обрабатывает как Fragment.
Фрагменты в Vue.js значительно упрощают архитектуру компонентов и делают шаблоны более естественными, позволяя сосредоточиться на содержании, а не на обходных контейнерах. Их правильное использование позволяет создавать чистый, масштабируемый и удобочитаемый код.