Для полноценной интеграции Naive UI с маршрутизацией
на Vue 3 требуется подключение пакета
vue-router. Установка осуществляется через npm или
yarn:
npm install vue-router
# или
yarn add vue-router
После установки необходимо создать файл конфигурации маршрутов,
например router/index.js:
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'
const routes = [
{ path: '/', name: 'Home', component: Home },
{ path: '/about', name: 'About', component: About }
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
В main.js подключается роутер:
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import naive from 'naive-ui'
const app = createApp(App)
app.use(router)
app.use(naive)
app.mount('#app')
Многие компоненты Naive UI, такие как
NButton, NMenu,
NBreadcrumb, поддерживают навигацию через роутер. Для
этого используется проп to и опция router.
<template>
<n-button type="primary" :to="{ name: 'About' }" router>
Перейти на About
</n-button>
</template>
В этом примере кнопка автоматически использует
router-link, что позволяет изменять маршруты без
перезагрузки страницы.
Компонент NMenu позволяет создавать боковые и верхние меню с динамической навигацией:
<template>
<n-menu :options="menuOptions" mode="horizontal" />
</template>
<script>
export default {
data() {
return {
menuOptions: [
{ label: 'Главная', key: '/', to: { name: 'Home' }, router: true },
{ label: 'О проекте', key: '/about', to: { name: 'About' }, router: true }
]
}
}
}
</script>
Использование пропсов to и router: true
автоматически интегрирует элементы меню с Vue Router, обеспечивая
плавную навигацию без перезагрузки страницы.
Vue Router предоставляет хуки для слежения за изменениями маршрута, что полезно для компонентов Naive UI, которые зависят от текущего маршрута, например, NMenu или NBreadcrumb:
import { useRoute } from 'vue-router'
import { ref, watch } from 'vue'
export default {
setup() {
const route = useRoute()
const activeKey = ref(route.path)
watch(route, (newRoute) => {
activeKey.value = newRoute.path
})
return { activeKey }
}
}
Такое наблюдение позволяет автоматически подсвечивать активный пункт меню или обновлять хлебные крошки при смене маршрута.
Компонент NBreadcrumb идеально подходит для отображения текущей навигации по маршрутам:
<template>
<n-breadcrumb>
<n-breadcrumb-item v-for="item in breadcrumbItems" :key="item.path">
<router-link :to="item.path">{{ item.label }}</router-link>
</n-breadcrumb-item>
</n-breadcrumb>
</template>
<script>
import { computed } from 'vue'
import { useRoute } from 'vue-router'
export default {
setup() {
const route = useRoute()
const breadcrumbItems = computed(() => {
const paths = route.path.split('/').filter(Boolean)
return paths.map((segment, index) => ({
path: '/' + paths.slice(0, index + 1).join('/'),
label: segment
}))
})
return { breadcrumbItems }
}
}
</script>
Каждый сегмент маршрута преобразуется в элемент хлебных крошек, при
этом используется router-link для корректной навигации без
перезагрузки страницы.
Для больших проектов рекомендуется использовать ленивую загрузку компонентов, чтобы уменьшить размер основной сборки:
const Home = () => import('../views/Home.vue')
const About = () => import('../views/About.vue')
При таком подходе компоненты будут загружаться только при необходимости, что снижает время первоначальной загрузки приложения. Компоненты Naive UI полностью совместимы с этим методом, что позволяет комбинировать визуальные элементы и динамическую маршрутизацию без проблем.
Иногда необходимо генерировать меню или страницы на основе данных с сервера:
const menuData = [
{ name: 'Dashboard', path: '/dashboard' },
{ name: 'Profile', path: '/profile' }
]
const routes = menuData.map(item => ({
path: item.path,
name: item.name,
component: () => import(`../views${item.path}.vue`)
}))
Комбинация динамического формирования маршрутов и компонентов Naive UI позволяет создавать полностью настраиваемые интерфейсы с поддержкой Vue Router, при этом упрощается поддержка и расширение проекта.
Для защиты маршрутов и реализации контроля доступа применяются navigation guards:
router.beforeEach((to, from, next) => {
const isAuthenticated = localStorage.getItem('token')
if (to.meta.requiresAuth && !isAuthenticated) {
next({ name: 'Home' })
} else {
next()
}
})
Компоненты Naive UI, такие как NButton и NMenu, при этом корректно обновляют визуальное состояние, соответствуя правилам маршрутизации и обеспечивая согласованность интерфейса.
to и router: true для
компонентов Naive UI при навигации.useRoute и watch.Эти подходы создают мощную и гибкую связку Naive UI + Vue Router, позволяя строить современный интерфейс с плавной навигацией и управлением состоянием.