app.vueNuxt 3 通过 ~/app.vue 为你的应用提供了一个中心入口。
app.vue 文件,Nuxt 将使用其默认版本。此文件是放置任何需要在应用启动时运行一次的自定义代码以及应用每个页面上都存在的组件的绝佳位置。例如,如果你只有一个布局,你可以将其移至 app.vue。
考虑创建一个 app.vue 文件,并包含任何需要在应用顶层运行一次的逻辑。你可以在此处查看示例。
如果你在应用中使用布局用于多个页面,则只需要进行微小的更改。
在 Nuxt 2 中,<Nuxt> 组件用于布局中以渲染当前页面。在 Nuxt 3 中,布局改为使用插槽,因此你必须将该组件替换为 <slot />。这还允许使用具名插槽和作用域插槽进行高级用例。阅读有关布局的更多信息。
你还需要更改使用 definePageMeta 编译器宏定义页面使用的布局的方式。布局将采用 kebab-case。因此,app/layouts/customLayout.vue 在页面中引用时会变为 custom-layout。
<Nuxt /> 替换为 <slot /> <template>
<div id="app-layout">
<main>
- <Nuxt />
+ <slot />
</main>
</div>
</template>
definePageMeta 选择页面使用的布局。+ <script setup>
+ definePageMeta({
+ layout: 'custom'
+ })
- <script>
- export default {
- layout: 'custom'
- }
</script>
~/layouts/_error.vue 移动到 ~/error.vue。参阅错误处理文档。如果你想确保此页面使用布局,你可以直接在 error.vue 中使用<NuxtLayout><template>
<div>
<NuxtLayout name="default">
<!-- -->
</NuxtLayout>
</div>
</template>
Nuxt 3 附带了一个可选的 vue-router 集成,通过源目录中存在 app/pages/ 目录触发。如果你只有一个页面,你可以考虑将其移至 app.vue 以获得更轻量的构建。
Nuxt 3 中定义动态路由的格式与 Nuxt 2 略有不同,因此你可能需要重命名 app/pages/ 中的一些文件。
_id 定义动态路由参数的地方,现在使用 [id]。_.vue 定义全捕获路由的地方,现在使用 [...slug].vue。在 Nuxt 2 中,你将使用 <Nuxt> 和 <NuxtChild> 定义任何嵌套路由(带有父组件和子组件)。在 Nuxt 3 中,这些已被单个 <NuxtPage> 组件取代。
如果你曾经将自定义页面键或 keep-alive 属性传递给 <Nuxt>,你现在将使用 definePageMeta 来设置这些选项。
如果你已直接在组件选项中定义页面或布局的转换,你现在需要使用 definePageMeta 来设置转换。自 Vue 3 以来,-enter 和 -leave CSS 类已重命名。当在 <slot> 上使用时,<Nuxt> 的 style 属性不再适用于转换,因此请将样式移至你的 -active 类。
<Nuxt> 和 <NuxtChild> 更新为 <NuxtPage>。this.$route 和 this.$router 迁移到使用 useRoute 和 useRouter 组合式函数。- URL: /users
- Page: /pages/users/index.vue
- URL: /users/some-user-name
- Page: /pages/users/_user.vue
- Usage: params.user
- URL: /users/some-user-name/edit
- Page: /pages/users/_user/edit.vue
- Usage: params.user
- URL: /users/anything-else
- Page: /pages/users/_.vue
- Usage: params.pathMatch
- URL: /users
- Page: /pages/users/index.vue
- URL: /users/some-user-name
- Page: /pages/users/[user].vue
- Usage: params.user
- URL: /users/some-user-name/edit
- Page: /pages/users/[user]/edit.vue
- Usage: params.user
- URL: /users/anything-else
- Page: /pages/users/[...slug].vue
- Usage: 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', // or { name: 'page' }
}
</script>
<template>
<div>
<NuxtPage />
</div>
</template>
<script setup lang="ts">
// This compiler macro works in both <script> and <script setup>
definePageMeta({
// you can also pass a string or a computed property
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。
await navigateTo,或者通过函数返回其结果来链式调用。<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>