页面和布局
app.vue
Nuxt 3 通过 ~/app.vue
提供了应用程序的中央入口点。
app.vue
文件,Nuxt 将使用其默认版本。此文件是放置任何需要在应用程序启动时运行的自定义代码的绝佳位置,以及在应用程序的每个页面上都存在的任何组件。例如,如果您只有一个布局,可以将其移动到 app.vue
中。
迁移
考虑创建一个 app.vue
文件,并包含需要在应用程序顶层运行的任何逻辑。您可以在这里查看示例。
布局
如果您在应用程序中为多个页面使用布局,只需要进行很小的更改。
在 Nuxt 2 中, <Nuxt>
组件在布局中用于呈现当前页面。在 Nuxt 3 中,布局使用插槽,因此您需要将该组件替换为 <slot />
。这也允许使用具名和作用域插槽的高级用例。了解更多关于布局的信息。
您还需要更改如何使用 definePageMeta
编译器宏定义页面使用的布局。布局将采用 kebab-case 形式。因此,layouts/customLayout.vue
在页面中引用时变为 custom-layout
。
迁移
- 将
<Nuxt />
替换为<slot />
layouts/custom.vue<template> <div id="app-layout"> <main> - <Nuxt /> + <slot /> </main> </div> </template>
- 使用
definePageMeta
选择页面使用的布局。pages/index.vue+ <script setup> + definePageMeta({ + layout: 'custom' + }) - <script> - export default { - layout: 'custom' - } </script>
- 将
~/layouts/_error.vue
移动到~/error.vue
。请参阅 错误处理文档。如果您想确保此页面使用布局,可以直接在error.vue
内使用<NuxtLayout>
:error.vue<template> <div> <NuxtLayout name="default"> <!-- --> </NuxtLayout> </div> </template>
页面
Nuxt 3 带有一个可选的 vue-router
集成,这由源目录中 pages/
目录的存在触发。如果您只有一个页面,您可以考虑将其移至 app.vue
以获得更轻的构建。
动态路由
在 Nuxt 3 中定义动态路由的格式与 Nuxt 2 略有不同,因此您可能需要重命名 pages/
中的一些文件。
- 之前您使用
_id
定义动态路由参数,现在使用[id]
。 - 之前您使用
_.vue
定义 catch-all 路由,现在使用[...slug].vue
。
嵌套路由
在 Nuxt 2 中,您会使用 <Nuxt>
和 <NuxtChild>
定义任何嵌套路由(具有父子组件)。在 Nuxt 3 中,这些已被一个单一的 <NuxtPage>
组件替代。
页面键和 Keep-alive 属性
如果您之前向 <Nuxt>
传递了自定义页面键或 keep-alive 属性,现在您将使用 definePageMeta
来设置这些选项。
页面和布局过渡
如果您一直在组件选项中直接为页面或布局定义过渡,则现在需要使用 definePageMeta
来设置过渡。自 Vue 3 以来,-enter 和 -leave CSS 类已被重命名。在 <slot>
上使用的 <Nuxt>
的 style
属性不再适用于过渡,因此请将样式移动到您的 -active
类中。
迁移
- 将任何带有动态参数的页面重命名为匹配新格式。
- 将
<Nuxt>
和<NuxtChild>
更新为<NuxtPage>
。 - 如果您正在使用组合 API,您还可以迁移
this.$route
和this.$router
使用useRoute
和useRouter
组合式 API。
示例:动态路由
- URL: /users
- 页面: /pages/users/index.vue
- URL: /users/some-user-name
- 页面: /pages/users/_user.vue
- 用法: params.user
- URL: /users/some-user-name/edit
- 页面: /pages/users/_user/edit.vue
- 用法: params.user
- URL: /users/anything-else
- 页面: /pages/users/_.vue
- 用法: params.pathMatch
- URL: /users
- 页面: /pages/users/index.vue
- URL: /users/some-user-name
- 页面: /pages/users/[user].vue
- 用法: params.user
- URL: /users/some-user-name/edit
- 页面: /pages/users/[user]/edit.vue
- 用法: params.user
- URL: /users/anything-else
- 页面: /pages/users/[...slug].vue
- 用法: params.slug
示例:嵌套路由和 definePageMeta
<template>
<div>
<NuxtChild keep-alive :keep-alive-props="{ exclude: ['modal'] }" :nuxt-child-key="$route.slug" />
</div>
</template>
<script>
export default {
transition: 'page' // 或 { name: 'page' }
}
</script>
<template>
<div>
<NuxtPage />
</div>
</template>
<script setup lang="ts">
// 此编译器宏适用于 <script> 和 <script setup>
definePageMeta({
// 您还可以传递字符串或计算属性
key: route => route.slug,
transition: {
name: 'page',
},
keepalive: {
exclude: ['modal']
},
})
</script>
<NuxtLink>
组件
全球 NuxtLink 组件的大多数语法和功能是相同的。如果您一直在使用快捷方式 <NLink>
格式,则应将其更新为使用 <NuxtLink>
。
<NuxtLink>
现在可以替代 所有 链接,甚至是外部链接。您可以阅读更多信息,以及如何扩展它以提供自己的链接组件。
编程导航
从 Nuxt 2 迁移到 Nuxt 3 时,您需要更新编程导航用户的方式。在 Nuxt 2 中,您可以通过 this.$router
访问底层的 Vue Router。在 Nuxt 3 中,您可以使用 navigateTo()
实用方法,它允许您将路由和参数传递给 Vue Router。
navigateTo
上使用 await
或通过从函数返回它的结果进行链式调用。<script>
export default {
methods: {
navigate(){
this.$router.push({
path: '/search',
query: {
name: 'first name',
type: '1'
}
})
}
}
}
</script>
<script setup lang="ts">
function navigate(){
return navigateTo({
path: '/search',
query: {
name: 'first name',
type: '1'
}
})
}
</script>