您正在浏览 Nuxt 2 文档。前往 Nuxt 3 文档, 或了解更多关于 Nuxt 2 长期支持

页面目录

pages 目录包含应用程序的视图和路由。Nuxt 读取此目录中的所有 .vue 文件并自动创建路由器配置。


也可以使用 .js 文件或 .ts 文件创建路由。

每个页面组件都是 Vue 组件,但 Nuxt 添加了特殊属性和功能,使通用应用程序的开发尽可能简单。

pages
<template>
  <h1 class="red">Hello {{ name }}!</h1>
</template>

<script>
  export default {
    // 页面属性在此处
  }
</script>

<style>
  .red {
    color: red;
  }
</style>

动态页面

当页面名称来自 API 或不想多次创建相同页面时,可以创建动态页面。要创建动态页面,在 .vue 文件名前添加下划线。如果想让目录动态化,在目录名前添加下划线。文件名和目录名可以自由命名,但必须在名称前加下划线。

例如,pages 文件夹中有 _slug.vue 文件时,可以通过 context 的 params.slug 访问值。

pages/_slug.vue
<template>
  <h1>{{ this.slug }}</h1>
</template>

<script>
  export default {
    async asyncData({ params }) {
      const slug = params.slug // 访问 "/abc" 路径时,slug 为 "abc"
      return { slug }
    }
  }
</script>

/_book 文件夹中创建 /_slug.vue 文件时,可以通过 context 的 params.slugparams.book 访问值。

pages/_book/_slug.vue
<template>
  <h1>{{ this.book }} / {{ this.slug }}</h1>
</template>

<script>
  export default {
    async asyncData({ params }) {
      const book = params.book
      const slug = params.slug
      return { book, slug }
    }
  }
</script>

属性

asyncData

asyncData 在每次加载组件之前调用,可以是异步的,接收 context 作为参数。asyncData 的结果会与 data 合并。

pages/index.vue
export default {
  asyncData(context) {
    return { name: 'World' }
  }
}

fetch

fetch 可用于异步获取数据,在服务端渲染路由时调用,在客户端导航时调用。

<script>
  export default {
    data() {
      return {
        posts: []
      }
    },
    async fetch() {
      this.posts = await fetch('https://api.nuxtjs.dev/posts').then(res =>
        res.json()
      )
    }
  }
</script>

为当前页面设置特定的 <meta> 标签。Nuxt 使用 vue-meta 更新应用程序的文档头和 meta 属性。

pages/index.vue
export default {
  head() {
    // 为此页面设置 meta 标签
  }
}

layout

指定 layouts 目录中定义的布局。

pages/index.vue
export default {
  layout: 'blog'
}

loading

将 loading 设为 false 时,可以防止进入页面时自动调用 this.$nuxt.$loading.finish(),以及离开页面时自动调用 this.$nuxt.$loading.start()

pages/index.vue
export default {
  loading: false
}
仅在 nuxt.config.js 中设置了 loading 时适用。

transition

为此页面设置自定义过渡。

pages/index.vue
export default {
  transition: 'fade'
}

scrollToTop

scrollToTop 可以告诉 Nuxt 在渲染页面前滚动到顶部。默认情况下,切换到其他页面时会滚动到顶部,但对于子路由会保持滚动位置。如果想在渲染子路由时也滚动到顶部,请将 scrollToTop 设为 true

pages/index.vue
export default {
  scrollToTop: true
}

反之,父路由也可以手动将 scrollToTop 设为 false

如果想覆盖 Nuxt 关于滚动的默认行为,请参阅 scrollBehavior 选项

middleware

为此页面定义中间件,在渲染页面前调用。

pages/index.vue
export default {
  middleware: 'auth'
}

watchQuery

设置 watchQuery 键,指定要监听的查询字符串。定义的字符串发生变化时,所有组件方法(asyncData、fetch、validate、layout 等)都会被调用。为提升性能,默认禁用监听。

pages/index.vue
export default {
  watchQuery: ['page']
}
警告:v2.12 引入的新 fetch 钩子不受 watchQuery 影响。有关详细信息,请参阅监听查询字符串变化
pages/index.vue
export default {
  watchQuery: true
}

也可以使用 watchQuery(newQuery, oldQuery) 函数进行更精细的监听:

pages/index.vue
export default {
  watchQuery(newQuery, oldQuery) {
    // 仅当旧查询字符串包含 `bar` 且新查询字符串包含 `foo` 时才执行组件方法
    return newQuery.foo && oldQuery.bar
  }
}

key

与 Vue 组件中用作虚拟 DOM 提示的 key 属性类似,此属性允许从页面本身(而非父组件)定义键值。

Nuxt 默认此值为 $route.path,即导航到不同路由时会创建干净的页面组件,逻辑上等同于:

<router-view :key="$route.path" />

此属性可以是 StringFunction,以路由为第一个参数。

忽略页面

如果想忽略页面,在文件名前加 -,它就不会包含在 router.js 文件中。

例如,pages/-about.vue 会被忽略。

配置

通过设置 dir.pages 选项可以将 pages/ 目录重命名为其他名称:

nuxt.config.js
export default {
  dir: {
    // 将 `pages` 目录重命名为 `routes`
    pages: 'routes'
  }
}
Edit this page on GitHub Updated at Tue, Apr 14, 2026