Teleport: порталы в Vue
▸Что такое Teleport
Teleport позволяет рендерить дочерний контент в другое место DOM, сохраняя реактивность и контекст Vue.
▸Базовое использование
1<template>2 <button @click="showModal = true">Открыть модалку</button>3 <Teleport to="body">4 <div v-if="showModal" class="modal">5 <p>Модальное окно</p>6 <button @click="showModal = false">Закрыть</button>7 </div>8 </Teleport>9</template>
▸to: куда телепортировать
1<!-- В body -->2<Teleport to="body">...</Teleport>34<!-- В конкретный элемент -->5<div id="modal-container"></div>6<Teleport to="#modal-container">...</Teleport>
▸disabled: условный телепорт
1<Teleport to="body" :disabled="isMobile">2 <!-- На десктопе — в body, на мобилке — на месте -->3</Teleport>4``>56## Suspense: асинхронные компоненты78### Что такое Suspense910Suspense позволяет отображать загрузочный индикатор пока асинхронные компоненты не загрузятся.1112### Базовое использование
12### Асинхронный компонент
const data = await fetch('/api/data').then(r => r.json());
12## комбинирование Teleport и Suspense
12## Практические примеры34### Модальное окно
const props = defineProps({ show: Boolean });
const emit = defineEmits(['close']);
12### Toast уведомления
{{ toast.message }}
12### Lazy загрузка
import { defineAsyncComponent } from 'vue';
const Dashboard = defineAsyncComponent(() =>
import('./components/Dashboard.vue')
);
12## Обработка ошибок34### ErrorCaptured
export default {
errorCaptured(err, instance, info) {
console.error('Ошибка:', err);
return false; // остановить распространение ошибки
},
};
12## Паттерны использования34### Dashboard с lazy loaded виджетами
12### Прогрессивная загрузка