<NuxtPage>
<NuxtPage> 组件用于显示位于 pages/ 目录中的页面。
<NuxtPage> 是 Nuxt 内置的组件。它可以让你显示位于 app/pages/ 目录中的顶层或嵌套页面。
<NuxtPage> 是 Vue Router 中 <RouterView> 的包装组件。应该使用它而不是 <RouterView>,因为前者会额外处理内部状态。否则,useRoute() 可能返回错误的路径。
:
<NuxtPage> 包含以下组件:
<template>
<RouterView v-slot="{ Component }">
<!-- 可选,使用过渡时 -->
<Transition>
<!-- 可选,使用 keep-alive 时 -->
<KeepAlive>
<Suspense>
<component :is="Component" />
</Suspense>
</KeepAlive>
</Transition>
</RouterView>
</template>
默认情况下,Nuxt 不会启用 <Transition> 和 <KeepAlive>。你可以在 nuxt.config 文件中启用它们,或者在 <NuxtPage> 上设置 transition 和 keepalive 属性。如果要为特定页面定义,可以在页面组件的 definePageMeta 中设置。
如果在页面组件中启用了 <Transition>,请确保该页面只有一个根元素。
:
由于 <NuxtPage> 在底层使用了 <Suspense>,页面变化期间的组件生命周期行为不同于典型的 Vue 应用。
在典型的 Vue 应用中,新页面组件只有在前一个组件被完全卸载之后才会挂载。然而在 Nuxt 中,由于 Vue <Suspense> 的实现方式,新页面组件会在前一个组件卸载之前挂载。
Props
name:告诉<RouterView>渲染匹配路由记录的 components 选项中对应名称的组件。关于name@view.vue文件名约定,请参见 命名视图。- 类型:
string
- 类型:
route:已解析所有组件的路由位置。- 类型:
RouteLocationNormalized
- 类型:
pageKey:控制<NuxtPage>组件何时重新渲染。- 类型:
string或function
- 类型:
transition:为所有使用NuxtPage组件渲染的页面定义全局过渡。- 类型:
boolean或TransitionProps
- 类型:
keepalive:控制使用NuxtPage组件渲染的页面的状态保留。- 类型:
boolean或KeepAliveProps
- 类型:
Nuxt 通过扫描并渲染在 /pages 目录中找到的所有 Vue 组件文件,自动解析 name 和 route。
:
示例
例如,如果你传入一个永远不变 key,<NuxtPage> 组件将只渲染一次——在它首次挂载时。
<template>
<NuxtPage page-key="static" />
</template>
你也可以基于当前路由使用动态 key:
<NuxtPage :page-key="route => route.fullPath" />
不要在这里使用 $route 对象,因为它可能会导致 <NuxtPage> 使用 <Suspense> 渲染页面时出现问题。
:
或者,可以通过 /pages 目录中 Vue 组件 <script> 部分的 definePageMeta 将 pageKey 作为 key 值传入。
<script setup lang="ts">
definePageMeta({
key: route => route.fullPath,
})
</script>
页面 Ref
要获取页面组件的 ref,请通过 ref.value.pageRef 访问。
<script setup lang="ts">
const page = ref()
function logFoo () {
page.value.pageRef.foo()
}
</script>
<template>
<NuxtPage ref="page" />
</template>
<script setup lang="ts">
const foo = () => {
console.log('调用了 foo 方法')
}
defineExpose({
foo,
})
</script>
自定义 Props
<NuxtPage> 也接受你可能需要向下传递的自定义 props。
例如,在下面的示例中,foobar 的值将传递给 NuxtPage 组件,然后再传递给页面组件。
<template>
<NuxtPage :foobar="123" />
</template>
我们可以在页面组件中访问 foobar prop:
<script setup lang="ts">
const props = defineProps<{ foobar: number }>()
console.log(props.foobar) // 输出:123
如果你没有用 defineProps 定义该 prop,任何传递给 NuxtPage 的 props 仍然可以直接从页面的 attrs 访问:
<script setup lang="ts">
const attrs = useAttrs()
console.log(attrs.foobar) // 输出:123
</script>