--- icon: IconDirectory title: 'pages' head.title: Pages directory --- # Pages directory Nuxt provides a file-based routing to create routes within your web application using [Vue Router](https://router.vuejs.org) under the hood. ::alert{type="info"} This directory is **optional**, meaning that [`vue-router`](https://router.vuejs.org) won't be included if you only use [app.vue](/guide/directory-structure/app), reducing your application's bundle size. :: ## Usage Pages are Vue components and can have the `.vue`, `.js`, `.jsx`, `.ts` or `.tsx` extension. ::code-group ```vue [pages/index.vue] ``` ```ts [pages/index.ts] // https://vuejs.org/guide/extras/render-function.html export default defineComponent({ render () { return h('h1', 'Index page') } }) ``` ```ts [pages/index.tsx] // https://vuejs.org/guide/extras/render-function.html#jsx-tsx export default defineComponent({ render () { return

Index page

} }) ``` :: The `pages/index.vue` file will be mapped to the `/` route of your application. If you are using [app.vue](/guide/directory-structure/app), make sure to use the `` component to display the current page: ```vue [app.vue] ``` ::alert{type=warning} Note that pages **must have a single root element** to allow route transitions between pages. :: ## Dynamic Routes If you place anything within square brackets, it will be turned into a [dynamic route](https://router.vuejs.org/guide/essentials/dynamic-matching.html) parameter. You can mix and match multiple parameters and even non-dynamic text within a file name or directory. ### Example ```bash -| pages/ ---| index.vue ---| users-[group]/ -----| [id].vue ``` Given the example above, you can access group/id within your component via the `$route` object: ```vue [pages/users-[group]/[id].vue] ``` Navigating to `/users-admins/123` would render: ```html

admins - 123

``` If you want to access the route using Composition API, there is a global `useRoute` function that will allow you to access the route just like `this.$route` in the Options API. ```vue ``` ## Catch all route If you need a catch-all route, you create it by using a file named like `[...slug].vue`. This will match _all_ routes under that path. ```vue [pages/[...slug].vue] ``` Navigating to `/hello/world` would render: ```html

["hello", "world"]

``` ## Nested Routes It is possible to display [nested routes](https://next.router.vuejs.org/guide/essentials/nested-routes.html) with ``. Example: ```bash -| pages/ ---| parent/ ------| child.vue ---| parent.vue ``` This file tree will generate these routes: ```js [ { path: '/parent', component: '~/pages/parent.vue', name: 'parent', children: [ { path: 'child', component: '~/pages/parent/child.vue', name: 'parent-child' } ] } ] ``` To display the `child.vue` component, you have to insert the `` component inside `pages/parent.vue`: ```html{}[pages/parent.vue] ``` ### Child route keys If you want more control over when the `` component is re-rendered (for example, for transitions), you can either pass a string or function via the `pageKey` prop, or you can define a `key` value via `definePageMeta`: ```html{}[pages/parent.vue] ``` Or alternatively: ```html{}[pages/child.vue] ``` ## Page Metadata You might want to define metadata for each route in your app. You can do this using the `definePageMeta` macro, which will work both in ` ``` This data can then be accessed throughout the rest of your app from the `route.meta` object. ```vue ``` If you are using nested routes, the page metadata from all these routes will be merged into a single object. For more on route meta, see the [vue-router docs](https://router.vuejs.org/guide/advanced/meta.html#route-meta-fields). Much like `defineEmits` or `defineProps` (see [Vue docs](https://vuejs.org/api/sfc-script-setup.html#defineprops-defineemits)), `definePageMeta` is a **compiler macro**. It will be compiled away so you cannot reference it within your component. Instead, the metadata passed to it will be hoisted out of the component. Therefore, the page meta object cannot reference the component (or values defined on the component). However, it can reference imported bindings. ```vue ``` ### Special Metadata Of course, you are welcome to define metadata for your own use throughout your app. But some metadata defined with `definePageMeta` has a particular purpose: #### `keepalive` Nuxt will automatically wrap your page in [the Vue `` component](https://vuejs.org/guide/built-ins/keep-alive.html#keepalive) if you set `keepalive: true` in your `definePageMeta`. This might be useful to do, for example, in a parent route which has dynamic child routes, if you want to preserve page state across route changes. You can also set props to be passed to `` (see a full list [here](https://vuejs.org/api/built-in-components.html#keepalive)). #### `key` [See above](#child-route-keys). #### `layout` You can define the layout used to render the route. This can be either false (to disable any layout), a string or a ref/computed, if you want to make it reactive in some way. [More about layouts](/guide/directory-structure/layouts). #### `middleware` You can define middleware to apply before loading this page. It will be merged with all the other middleware used in any matching parent/child routes. It can be a string, a function (an anonymous/inlined middleware function following [the global before guard pattern](https://router.vuejs.org/guide/advanced/navigation-guards.html#global-before-guards)), or an array of strings/functions. [More about named middleware](/guide/directory-structure/middleware). #### `layoutTransition` and `pageTransition` You can define transition properties for the `` components that wraps your pages and layouts, or pass `false` to disable the `` wrapper for that route. You can see a list of options that can be passed [here](https://vuejs.org/api/built-in-components.html#transition) or read [more about how transitions work](https://vuejs.org/guide/built-ins/transition.html#transition). ## Navigation To navigate between pages of your app, you should use the [``](/api/components/nuxt-link) component. This component is included with Nuxt and therefore you don't have to import it as you do with other components. A simple link to the `index.vue` page in your `pages` folder: ```html ``` ::alert{type="info"} Learn more about [``](/api/components/nuxt-link) usage. :: ## Router options It is possible to set default [vue-router options](https://router.vuejs.org/api/#routeroptions). **Note:** `history` and `routes` options will be always overriden by Nuxt. ### Using `app/router.options` This is the recommaned way to specify router options. ```js [app/router.options.ts] import type { RouterConfig } from '@nuxt/schema' // https://router.vuejs.org/api/#routeroptions export default { } ``` ### Using `nuxt.config` **Note:** Only JSON serializable options are configurable: - `linkActiveClass` - `linkExactActiveClass` - `end` - `sensitive` - `strict` ```js [nuxt.config] export default defineNuxtConfig({ router: { // https://router.vuejs.org/api/#routeroptions options: {} } }) ```