definePageMeta
为你的页面组件定义元数据。
definePageMeta 是一个编译器宏,可用于为位于 app/pages/ 目录中的页面组件设置元数据(除非另有设置)。这样,你可以为 Nuxt 应用的每个静态或动态路由设置自定义元数据。
app/pages/some-page.vue
<script setup lang="ts">
definePageMeta({
layout: 'default',
})
</script>
类型
签名
export function definePageMeta (meta: PageMeta): void
interface PageMeta {
validate?: ((route: RouteLocationNormalized) => boolean | Promise<boolean> | Partial<NuxtError> | Promise<Partial<NuxtError>>)
redirect?: RouteRecordRedirectOption
name?: string
path?: string
props?: RouteRecordRaw['props']
alias?: string | string[]
groups?: string[]
pageTransition?: boolean | TransitionProps
layoutTransition?: boolean | TransitionProps
viewTransition?: ViewTransitionPageOptions['enabled'] | ViewTransitionPageOptions
key?: false | string | ((route: RouteLocationNormalizedLoaded) => string)
keepalive?: boolean | KeepAliveProps
layout?: false | LayoutKey | Ref<LayoutKey> | ComputedRef<LayoutKey> | { name?: LayoutKey | false, props?: Record<string, unknown> /* or the selected layout's props */ }
middleware?: MiddlewareKey | NavigationGuard | Array<MiddlewareKey | NavigationGuard>
scrollToTop?: boolean | ((to: RouteLocationNormalizedLoaded, from: RouteLocationNormalizedLoaded) => boolean)
[key: string]: unknown
}
参数
meta
- 类型:
PageMeta
接受以下页面元数据的对象name- 类型:
string
你可以为该页面的路由定义一个名称。默认情况下,名称是根据app/pages/目录内的路径生成的。
path- 类型:
string
如果你的模式比文件名所能表达的更复杂,你可以定义一个自定义正则表达式。
props- 类型:
RouteRecordRaw['props']
允许将路由params作为传给页面组件的 props 进行访问。
alias- 类型:
string | string[]
记录的别名。允许定义表现得像该记录副本的额外路径。允许使用如/users/:id和/u/:id这样的路径简写。所有的alias和path值必须共享相同的 params。
groupsv4.3- 类型:
string[]
基于文件夹结构,该页面所属的路由组。对于路由组内的页面会自动填充。
keepalive- 类型:
boolean|KeepAliveProps
当你希望在路由更改时保留页面状态,或者使用KeepAliveProps进行精细控制时,请将其设置为true。
key- 类型:
false|string|((route: RouteLocationNormalizedLoaded) => string)
当你需要更好地控制<NuxtPage>组件何时重新渲染时,请设置key值。
layout- 类型:
false|LayoutKey|Ref<LayoutKey>|ComputedRef<LayoutKey>|{ name?: LayoutKey | false; props?: Record<string, unknown> /* or the selected layout's props */ }
为每个路由设置布局的静态或动态名称。如果需要禁用默认布局,可以将其设置为false。
你还可以传递一个包含name和props的对象,以便向你的布局组件传递类型化的 props。当你的布局使用defineProps定义 props 时,它们将在definePageMeta中完全具备类型推导。
layoutTransition- 类型:
boolean|TransitionProps
设置应用于当前布局的过渡效果名称。你也可以将此值设置为false来禁用布局过渡。
middleware- 类型:
MiddlewareKey|NavigationGuard|Array<MiddlewareKey | NavigationGuard>
直接在definePageMeta中定义匿名或命名中间件。了解有关路由中间件的更多信息。
pageTransition- 类型:
boolean|TransitionProps
设置应用于当前页面的过渡效果名称。你也可以将此值设置为false来禁用页面过渡。
viewTransition- 类型:
boolean | 'always' | ViewTransitionPageOptions
实验性功能,仅在你的 nuxt.config 文件中启用时可用
为当前页面启用/禁用视图过渡(View Transitions)。如果设置为 true,当用户的浏览器匹配prefers-reduced-motion: reduce时,Nuxt 将不应用过渡(推荐)。如果设置为always,Nuxt 将始终应用过渡。
你还可以传递一个ViewTransitionPageOptions对象来配置视图过渡类型enabled:boolean | 'always'- 启用/禁用过渡types:string[] | (to, from) => string[]- 应用于涉及此页面的任何过渡的类型toTypes:string[] | (to, from) => string[]- 仅在导航到此页面时应用的类型fromTypes:string[] | (to, from) => string[]- 仅在从此页面导航离开时应用的类型
redirect- 类型:
RouteRecordRedirectOption
如果直接匹配该路由,则重定向到哪里。重定向发生在任何导航守卫之前,并会使用新的目标位置触发一次新的导航。
validate- 类型:
(route: RouteLocationNormalized) => boolean | Promise<boolean> | Partial<NuxtError> | Promise<Partial<NuxtError>>
验证给定路由是否可以使用此页面有效渲染。如果有效则返回 true,否则返回 false。如果找不到其他匹配项,这将意味着 404。你还可以直接返回一个带有status/statusText的对象,以立即响应错误(不会检查其他匹配项)。
scrollToTop- 类型:
boolean | (to: RouteLocationNormalized, from: RouteLocationNormalized) => boolean
告诉 Nuxt 是否在渲染页面之前滚动到顶部。导航独立于渲染,因此即使页面没有重新渲染(例如当使用固定的key时),滚动行为也总是会被触发。在这种情况下,将scrollToTop: false设置为禁用滚动。如果你想覆盖 Nuxt 的默认滚动行为,可以在~/router.options.ts中进行设置(更多信息请参见自定义路由)。
[key: string]- 类型:
any
除了上述属性之外,你还可以设置自定义元数据。你可能希望通过扩展meta对象的类型来以类型安全的方式进行设置。
- 类型:
示例
基本用法
以下示例演示了
key如何成为一个返回值的函数;keepalive属性如何确保在多个组件之间切换时不会缓存<modal>组件;- 添加
pageType作为自定义属性
app/pages/some-page.vue
<script setup lang="ts">
definePageMeta({
key: route => route.fullPath,
keepalive: {
exclude: ['modal'],
},
pageType: 'Checkout',
})
</script>
定义中间件
以下示例展示了如何直接在 definePageMeta 中使用 function 定义中间件,或者设置为与位于 app/middleware/ 目录中的中间件文件名相匹配的 string
app/pages/some-page.vue
<script setup lang="ts">
definePageMeta({
// define middleware as a function
middleware: [
function (to, from) {
const auth = useState('auth')
if (!auth.value.authenticated) {
return navigateTo('/login')
}
if (to.path !== '/checkout') {
return navigateTo('/checkout')
}
},
],
// ... or a string
middleware: 'auth',
// ... or multiple strings
middleware: ['auth', 'another-named-middleware'],
})
</script>
使用自定义正则表达式
自定义正则表达式是解决重叠路由之间冲突的好方法,例如
这两个路由 "/test-category" 和 "/1234-post" 同时匹配 [postId]-[postSlug].vue 和 [categorySlug].vue 页面路由。
为了确保我们在 [postId]-[postSlug] 路由中只为 postId 匹配数字(\d+),我们可以将以下内容添加到 [postId]-[postSlug].vue 页面模板中
app/pages/[postId]-[postSlug].vue
<script setup lang="ts">
definePageMeta({
path: '/:postId(\\d+)-:postSlug',
})
</script>
有关更多示例,请参见 Vue Router 的匹配语法。
定义布局
你可以定义与默认位于 app/layouts/ 目录中的布局文件名相匹配的布局。你也可以通过将 layout 设置为 false 来禁用布局
app/pages/some-page.vue
<script setup lang="ts">
definePageMeta({
// set custom layout
layout: 'admin',
// ... or disable a default layout
layout: false,
})
</script>
向布局传递 Props
你可以通过对 layout 使用对象语法来向布局传递 props。如果你的布局使用 defineProps 定义了 props,这些 props 将完全具备类型推导。
<script setup lang="ts">
definePageMeta({
layout: {
name: 'panel',
props: {
sidebar: true,
title: 'Dashboard',
},
},
})
</script>
<script setup lang="ts">
const props = defineProps<{
sidebar?: boolean
title?: string
}>()
</script>
<template>
<div>
<aside v-if="sidebar">
Sidebar
</aside>
<main>
<h1>{{ title }}</h1>
<slot />
</main>
</div>
</template>
通过
definePageMeta 设置的布局 props 会根据布局的 defineProps 完全进行类型推导。你将在编辑器中获得自动补全和类型检查。