Naive UI предоставляет мощный механизм работы с иконками, который позволяет не только использовать встроенные наборы, но и интегрировать собственные SVG-иконки, что особенно важно при разработке уникальных интерфейсов и поддержке фирменного стиля приложения.
Naive UI содержит компонент NIcon, который служит
контейнером для любых иконок. Для встроенных иконок достаточно
импортировать их из пакета @vicons/xxx и обернуть в
NIcon.
import { NButton, NIcon } from 'naive-ui'
import { Add } from '@vicons/ionicons5'
export default {
components: { NButton, NIcon },
template: `
<n-button>
<n-icon :component="Add" />
Добавить
</n-button>
`
}
Ключевой момент — NIcon принимает проп
component, который должен быть Vue-компонентом,
представляющим иконку. Это позволяет использовать любые иконки,
совместимые с Vue, в едином стиле с библиотекой.
Для интеграции собственных SVG-иконок можно использовать несколько подходов:
vite-svg-loader или vue-svg-loader позволяет
импортировать SVG-файл как Vue-компонент и передавать его в
NIcon.import MyCustomIcon from './icons/MyCustomIcon.svg'
export default {
components: { NIcon },
template: `
<n-icon :component="MyCustomIcon" />
`
}
NIcon
поддерживает слот default, что позволяет напрямую вставлять
SVG-код:<n-icon>
<svg width="24" height="24" viewBox="0 0 24 24">
<path d="M12 2L15 8H9L12 2Z" fill="currentColor"/>
</svg>
</n-icon>
Использование fill="currentColor" гарантирует, что
иконка будет наследовать цвет из CSS, что упрощает стилизацию в темной и
светлой теме.
NIcon автоматически наследует размеры и цвета от
родительских компонентов, однако для тонкой настройки доступны следующие
возможности:
.custom-icon svg {
width: 32px;
height: 32px;
color: #42b983;
}
style или
class:<n-icon :component="MyCustomIcon" style="width:40px;height:40px;color:red;" />
<n-icon :component="MyCustomIcon" :style="{ color: isActive ? 'green' : 'gray' }" />
Поскольку NIcon является обычным Vue-компонентом, на
него можно навешивать события:
<n-icon :component="MyCustomIcon" @click="handleClick" />
Это особенно удобно для кнопок управления, уведомлений или интерактивных элементов.
Для проектов с большим количеством собственных иконок рекомендуется создать централизованную библиотеку компонентов:
// icons/index.js
import AddIcon from './AddIcon.svg'
import DeleteIcon from './DeleteIcon.svg'
export const icons = {
add: AddIcon,
delete: DeleteIcon
}
Использование:
import { icons } from './icons'
<n-icon :component="icons.add" />
Такой подход упрощает поддержку и масштабирование интерфейса, позволяет легко заменять иконки без изменения кода компонентов.
Для сохранения единого стиля с темами Naive UI важно использовать
переменные темы и currentColor:
<n-icon>
<svg viewBox="0 0 24 24">
<path d="..." fill="currentColor"/>
</svg>
</n-icon>
При смене темы автоматически изменяется цвет иконки, что обеспечивает согласованность интерфейса без дополнительных усилий.
Кастомные SVG-иконки легко анимировать через CSS или Vue-трансформации:
.rotate-icon svg {
transition: transform 0.3s;
}
.rotate-icon:hover svg {
transform: rotate(90deg);
}
<n-icon :component="MyCustomIcon" class="rotate-icon" />
Это позволяет создавать интерактивные и динамичные элементы, не прибегая к сторонним библиотекам.
Использование кастомных иконок в Naive UI сочетает гибкость
Vue-компонентов с мощью встроенного контейнера NIcon,
обеспечивая единый подход к визуальной идентичности, легкую стилизацию и
поддержку тем, а также упрощая интеграцию анимаций и обработку
событий.