---
title: "setPageLayout"
description: "setPageLayout 允许你动态更改页面的布局。"
canonical_url: "https://nuxt.zhcndoc.com/docs/3.x/api/utils/set-page-layout"
---
# setPageLayout

> setPageLayout 允许你动态更改页面的布局。

::important
`setPageLayout` 允许你动态更改页面的布局。它依赖于对 Nuxt 上下文的访问，因此只能在 [Nuxt 上下文](https://nuxt.zhcndoc.com/docs/3.x/guide/going-further/nuxt-app#the-nuxt-context) 中调用。
::

```ts [middleware/custom-layout.ts]
export default defineNuxtRouteMiddleware((to) => {
  // 设置你要导航到的路由的布局
  setPageLayout('other')
})
```

## 传递 Props 给布局

你可以通过提供一个对象作为第二个参数来向布局传递 props：

```ts [middleware/admin-layout.ts]
export default defineNuxtRouteMiddleware((to) => {
  setPageLayout('admin', {
    sidebar: true,
    title: 'Dashboard',
  })
})
```

布局组件随后可以接收这些 props：

```vue [layouts/admin.vue]
<script setup lang="ts">
const props = defineProps<{
  sidebar?: boolean
  title?: string
}>()
</script>

<template>
  <div>
    <aside v-if="sidebar">
      侧边栏
    </aside>
    <main>
      <h1>{{ title }}</h1>
      <slot />
    </main>
  </div>
</template>
```

::note
如果你选择在服务器端动态设置布局，**必须**在 Vue 渲染布局之前完成（即，在插件或路由中间件内进行），以避免水合不匹配的问题。
::

---

- [源码](https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/router.ts)


## Sitemap

See the full [sitemap](https://nuxt.zhcndoc.com/sitemap.md) for all pages.
