<NuxtPage>
需要 <NuxtPage> 组件来显示位于 pages/ 目录中的页面。
<NuxtPage>
是 Nuxt 自带的内置组件。它允许你显示位于 app/pages/
目录中的顶层或嵌套页面。
<NuxtPage>
是<RouterView>
的包装器,来自 Vue Router。它应该代替 <RouterView>
使用,因为前者会额外处理内部状态。否则,useRoute()
可能会返回不正确的路径。<NuxtPage>
包含以下组件
<template>
<RouterView v-slot="{ Component }">
<!-- Optional, when using transitions -->
<Transition>
<!-- Optional, when using 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>
的实现方式,新的页面组件在旧组件卸载 之前 就挂载了。
属性
name
:告诉<RouterView>
渲染匹配路由记录的 components 选项中具有相应名称的组件。- 类型:
string
- 类型:
route
:已解析所有组件的路由位置。- 类型:
RouteLocationNormalized
- 类型:
pageKey
:控制NuxtPage
组件何时重新渲染。- 类型:
string
或function
- 类型:
transition
:为所有使用NuxtPage
组件渲染的页面定义全局过渡。- 类型:
boolean
或TransitionProps
- 类型:
keepalive
:控制使用NuxtPage
组件渲染的页面状态保持。- 类型:
boolean
或KeepAliveProps
- 类型:
Nuxt 通过扫描并渲染
/pages
目录中找到的所有 Vue 组件文件,自动解析 name
和 route
。示例
例如,如果你传递一个从不更改的键,<NuxtPage>
组件将只渲染一次——在它首次挂载时。
app/app.vue
<template>
<NuxtPage page-key="static" />
</template>
你还可以使用基于当前路由的动态键
<NuxtPage :page-key="route => route.fullPath" />
不要在这里使用
$route
对象,因为它可能会导致 <NuxtPage>
使用 <Suspense>
渲染页面时出现问题。或者,pageKey
可以通过 definePageMeta
从 /pages
目录中 Vue 组件的 <script>
部分作为 key
值传递。
app/pages/my-page.vue
<script setup lang="ts">
definePageMeta({
key: route => route.fullPath,
})
</script>
在 Docs > 4 X > Examples > Routing > Pages 中阅读并编辑实时示例。
页面引用
要获取页面组件的 ref
,请通过 ref.value.pageRef
访问它
app/app.vue
<script setup lang="ts">
const page = ref()
function logFoo () {
page.value.pageRef.foo()
}
</script>
<template>
<NuxtPage ref="page" />
</template>
my-page.vue
<script setup lang="ts">
const foo = () => {
console.log('foo method called')
}
defineExpose({
foo,
})
</script>
自定义属性
<NuxtPage>
还接受你可能需要向下传递的自定义属性。
例如,在下面的例子中,foobar
的值将被传递给 NuxtPage
组件,然后传递给页面组件。
app/app.vue
<template>
<NuxtPage :foobar="123" />
</template>
我们可以在页面组件中访问 foobar
属性
app/pages/page.vue
<script setup lang="ts">
const props = defineProps<{ foobar: number }>()
console.log(props.foobar) // Outputs: 123
如果你没有使用 defineProps
定义属性,任何传递给 NuxtPage
的属性仍然可以直接从页面 attrs
中访问
app/pages/page.vue
<script setup lang="ts">
const attrs = useAttrs()
console.log(attrs.foobar) // Outputs: 123
</script>