Библиотека Naive UI предоставляет широкий набор компонентов для Vue 3, а VueUse — это коллекция утилит, упрощающих реактивное программирование. Совместное использование этих инструментов позволяет создавать гибкие и динамичные интерфейсы с минимальным количеством шаблонного кода.
Ключевой принцип взаимодействия заключается в том, что VueUse
предоставляет реактивные состояния и эффекты, которые можно
напрямую привязывать к свойствам компонентов Naive UI через
v-model или computed-свойства.
Простейший пример — синхронизация состояния n-switch с
реактивной переменной из VueUse:
import { ref } from 'vue';
import { useToggle } from '@vueuse/core';
import { NSwitch } from 'naive-ui';
const isActive = ref(false);
const toggleActive = useToggle(isActive);
// В шаблоне
<NSwitch v-model:value="isActive" @update:value="toggleActive()" />
Пояснение:
ref(false) создаёт реактивное булево значение.useToggle предоставляет функцию переключения
состояния.v-model:value связывает компонент Naive UI с реактивным
состоянием.Такой подход позволяет управлять компонентами без ручного
отслеживания событий @change и повторного присвоения
значений.
Использование watch и watchEffect из VueUse
позволяет автоматически реагировать на изменения состояния
компонентов:
import { watch } from 'vue';
import { useDark } from '@vueuse/core';
const isDark = useDark();
watch(isDark, (newValue) => {
console.log('Темная тема:', newValue);
});
Этот пример демонстрирует динамическую реакцию на переключение темы в
приложении. Компоненты Naive UI, такие как NButton или
NCard, можно адаптировать под изменения темы через привязку
стилей к состоянию isDark.
VueUse предоставляет useLocalStorage для синхронизации
реактивных данных с localStorage, что особенно полезно для
сохранения пользовательских настроек UI:
import { useLocalStorage } from '@vueuse/core';
const layoutMode = useLocalStorage('layoutMode', 'grid');
// Привязка к Naive UI компоненту
<NSelect v-model:value="layoutMode" :options="[
{ label: 'Grid', value: 'grid' },
{ label: 'List', value: 'list' }
]" />
Преимущества такого подхода:
NSelect,
NSegmented).Сочетание VueUse useTransition и компонентов Naive UI
позволяет создавать плавные эффекты при показе или скрытии
элементов:
import { useTransition } from '@vueuse/core';
import { ref } from 'vue';
import { NCollapse } from 'naive-ui';
const isOpen = ref(false);
const { style, isMounted } = useTransition(isOpen, { duration: 300 });
// В шаблоне
<NCollapse :value="isOpen">
<div :style="style">Контент с плавным появлением</div>
</NCollapse>
Здесь useTransition управляет стилями элемента в
зависимости от его состояния, что позволяет создавать плавные анимации
без прямого вмешательства в CSS.
Для реализации динамических интерфейсов часто требуются таймеры.
VueUse предлагает useIntervalFn и useTimeoutFn
для удобного управления:
import { useIntervalFn } from '@vueuse/core';
import { ref } from 'vue';
const count = ref(0);
const { pause, resume } = useIntervalFn(() => {
count.value++;
}, 1000);
Такой счетчик можно привязать к компонентам Naive UI:
<NButton @click="pause">Пауза</NButton>
<NButton @click="resume">Продолжить</NButton>
<NTag>{{ count }}</NTag>
VueUse предоставляет useFetch для реактивного получения
данных:
import { useFetch } from '@vueuse/core';
const { data, isFetching, error } = useFetch('https://api.example.com/items').json();
<NDataTable :columns="columns" :data="data" :loading="isFetching" />
Особенности интеграции:
data автоматически обновляет таблицу при изменении
ответа.isFetching можно использовать для отображения
индикатора загрузки через NSpin.NNotification.VueUse содержит утилиты для работы с окнами и событиями браузера:
useWindowSize, useMouse,
useElementVisibility. Например, адаптация компонента под
размер окна:
import { useWindowSize } from '@vueuse/core';
const { width } = useWindowSize();
const isMobile = computed(() => width.value < 768);
<NButton v-if="!isMobile">Полноразмерная кнопка</NButton>
<NButton v-else>Мобильная кнопка</NButton>
Такой подход позволяет строить адаптивные интерфейсы без необходимости писать сложный CSS или медиазапросы вручную.
v-model.Этот подход обеспечивает высокую скорость разработки и снижает количество рутинного кода при создании современных интерфейсов на Vue 3 с Naive UI.