В Naive UI слоты представляют собой мощный механизм для передачи кастомного контента в компоненты. С их помощью можно не просто вставлять текст или элементы, но и полностью контролировать структуру и поведение компонентов без необходимости их модификации.
Слоты объявляются в шаблоне компонента через атрибут
v-slot (или синтаксис # для краткости). Каждый
слот имеет имя, которое определяет, куда будет вставлен контент. Если
слот неименованный, он становится default slot.
Пример базового использования default слота:
<n-button>
Нажми меня
</n-button>
Здесь строка "Нажми меня" передается в default слот
компонента n-button.
Для именованных слотов синтаксис выглядит так:
<n-card>
<template #header>
Заголовок карточки
</template>
<template #footer>
Нижняя часть карточки
</template>
</n-card>
В этом примере компонент n-card имеет два слота:
header и footer. Контент каждого шаблона
вставляется в соответствующую область компонента.
Scoped slots позволяют передавать функции или данные из дочернего компонента в слот, что обеспечивает динамическую генерацию контента.
Пример:
<n-data-table :columns="columns" :data="tableData">
<template #cell="{ row, column }">
<span v-if="column.key === 'status'">{{ row.status }}</span>
<span v-else>{{ row[column.key] }}</span>
</template>
</n-data-table>
cell — именованный слот компонента
n-data-table.{ row, column } — объект, передаваемый из компонента,
содержащий данные строки и колонки.v-if и v-else позволяет
гибко управлять отображением данных для разных типов колонок.Naive UI поддерживает динамическое управление слотами через объект, где ключи — это имена слотов, а значения — функции, возвращающие JSX или шаблон.
Пример на JSX:
<n-dropdown
v-slots={{
trigger: () => <button>Открыть меню</button>,
default: () => <n-menu options={menuOptions} />
}}
/>
Такой подход особенно полезен для создания компонентов с
множественными слотами без необходимости писать отдельные
<template> блоки.
Компоненты Naive UI часто используют вложенные слоты для сложной кастомизации. Вложенные слоты позволяют комбинировать разные уровни контента.
Пример:
<n-popover>
<template #trigger>
<n-button>Показать подсказку</n-button>
</template>
<template #default>
<n-card>
<template #header>
Заголовок подсказки
</template>
Содержимое подсказки
</n-card>
</template>
</n-popover>
Здесь компонент n-popover использует слот
trigger для кнопки и слот default для карточки
с дополнительными слотами внутри.
Слоты могут передавать callback-функции для обработки событий. Это позволяет создавать интерактивные интерфейсы без изменения внутренней логики компонента.
Пример:
<n-upload :on-change="handleUpload">
<template #trigger="{ upload }">
<n-button @click="upload">Загрузить файл</n-button>
</template>
</n-upload>
trigger получает функцию upload через
scoped slot.upload() инициирует процесс загрузки.v-slots вместо большого количества вложенных
<template>.Slots в Naive UI предоставляют полноценный инструмент кастомизации, позволяющий строить гибкие и масштабируемые интерфейсы без вмешательства в исходный код компонентов. Использование default, именованных и scoped слотов обеспечивает удобную организацию контента и расширяемость компонентов.