Префиксы и суффиксы — один из ключевых механизмов композиции интерфейса в Naive UI. Они позволяют добавлять дополнительные элементы внутрь компонентов без изменения их структуры. Чаще всего используются в полях ввода, кнопках, селекторах и других интерактивных элементах.
Под префиксом понимается элемент, размещаемый в начале компонента, перед основным содержимым. Суффикс размещается в конце компонента, после основного содержимого.
Этот механизм позволяет:
Во многих компонентах Naive UI реализация выполняется через
слоты prefix и suffix.
В большинстве компонентов Naive UI используются именованные слоты:
prefixsuffixОни позволяют внедрять любой Vue-контент внутрь компонента.
Пример структуры:
<n-component>
<template #prefix>
...
</template>
Основное содержимое
<template #suffix>
...
</template>
</n-component>
Префикс располагается перед основным содержимым, а суффикс — после него.
Внутри слотов можно размещать:
n-inputКомпонент n-input чаще всего используется с префиксами и
суффиксами. Они позволяют добавлять иконки, обозначения валют, кнопки
очистки и прочие элементы.
<n-input placeholder="Введите значение">
<template #prefix>
$
</template>
<template #suffix>
USD
</template>
</n-input>
Результат:
$ [ ввод значения ] USD
Здесь:
$ — префиксUSD — суффиксПрефиксы и суффиксы часто применяются для размещения иконок.
<n-input placeholder="Поиск">
<template #prefix>
<n-icon>
<SearchOutline />
</n-icon>
</template>
</n-input>
Иконка поиска визуально показывает назначение поля.
Суффикс может использоваться для размещения интерактивных элементов.
<n-input v-model:value="password" type="password">
<template #suffix>
<n-button text>Показать</n-button>
</template>
</n-input>
Такой подход применяется для:
Содержимое суффикса может зависеть от состояния приложения.
<n-input v-model:value="email">
<template #suffix>
<n-icon v-if="isValid">
<CheckmarkCircle />
</n-icon>
</template>
</n-input>
Если значение корректно — отображается иконка подтверждения.
n-input-numberЧисловые поля часто используют суффиксы для отображения единиц измерения.
<n-input-number v-model:value="weight">
<template #suffix>
кг
</template>
</n-input-number>
Отображение:
[ 75 ] кг
Другие типичные единицы:
Префикс удобно использовать для валютных символов.
<n-input-number v-model:value="price">
<template #prefix>
€
</template>
</n-input-number>
Интерфейс:
€ [ 120 ]
n-selectВ селекторах префикс часто используется для отображения иконки или категории.
<n-select :options="options">
<template #prefix>
<n-icon>
<FilterOutline />
</n-icon>
</template>
</n-select>
Такой подход используется в:
n-buttonХотя кнопки чаще используют слот icon, иногда
применяются и префиксы/суффиксы.
<n-button>
<template #prefix>
<n-icon>
<DownloadOutline />
</n-icon>
</template>
Скачать
</n-button>
Результат:
[ ⬇ Скачать ]
Суффикс позволяет разместить иконку справа.
<n-button>
Далее
<template #suffix>
<n-icon>
<ArrowForward />
</n-icon>
</template>
</n-button>
Интерфейс:
[ Далее → ]
Префиксы и суффиксы позволяют создавать более сложные интерфейсные структуры.
<n-input v-model:value="query" placeholder="Поиск">
<template #prefix>
<n-icon>
<SearchOutline />
</n-icon>
</template>
<template #suffix>
<n-button text>Найти</n-button>
</template>
</n-input>
Интерфейс:
? [ поиск ] [Найти]
В слотах можно размещать несколько элементов.
<n-input>
<template #suffix>
<n-space>
<n-icon><Copy /></n-icon>
<n-icon><Share /></n-icon>
</n-space>
</template>
</n-input>
Так создаются панели действий внутри поля.
Слоты поддерживают любые Vue-компоненты.
<n-input>
<template #prefix>
<user-avatar />
</template>
</n-input>
Это позволяет внедрять:
Элементы внутри слотов наследуют стили компонента. Однако иногда требуется дополнительная настройка.
<n-input>
<template #suffix>
<span class="unit">px</span>
</template>
</n-input>
CSS:
.unit {
color: #999;
font-size: 12px;
}
Naive UI автоматически управляет:
Однако при использовании сложных компонентов может понадобиться дополнительная настройка.
Часто используется n-space.
<template #suffix>
<n-space size="small">
<n-icon><Edit /></n-icon>
<n-icon><Delete /></n-icon>
</n-space>
</template>
При использовании интерактивных элементов в суффиксах важно учитывать доступность интерфейса.
Рекомендации:
aria-labeldivПример:
<n-button text aria-label="Очистить">
<n-icon>
<CloseCircle />
</n-icon>
</n-button>
Префиксы и суффиксы являются частью виртуального DOM Vue. Их использование практически не влияет на производительность.
Однако следует избегать:
Особенно это важно в больших формах.
Наиболее частые варианты использования:
? поиск
? email
? пароль
px
%
kg
MB
ms
$
€
₽
¥
Префиксы и суффиксы должны оставаться компактными. Сложные структуры ухудшают читаемость интерфейса.
Плохо:
<n-input>
<template #prefix>
<div>
<span>Label</span>
<button>Action</button>
</div>
</template>
</n-input>
Иконки должны соответствовать размеру поля.
Рекомендуется использовать n-icon.
Слишком большое количество элементов в суффиксе делает поле сложным для восприятия.
Лучше ограничиваться:
Использование префиксов и суффиксов дает ряд преимуществ:
1. Композиционность
Компоненты остаются универсальными, а дополнительные элементы добавляются через слоты.
2. Гибкость
Можно добавлять любой Vue-контент.
3. Переиспользование
Один и тот же компонент применяется в разных сценариях.
4. Чистота API
Нет необходимости создавать множество специализированных компонентов.
Префиксы и суффиксы являются важной частью архитектуры Naive UI, обеспечивая гибкость и расширяемость интерфейсов без усложнения базовых компонентов.