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

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

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

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

## 向布局传递 Props :badge[v4.3]{color="info" size="xs" .align-middle}

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

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

然后布局就可以接收这些 props：

```vue [app/layouts/admin.vue]
<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>
```

::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.
