> Nuxt.js 依据页面文件的目录结构来生成应用的路由配置, 和上世纪宇宙最强开发语言PHP创建路由的方式一样的简单。

Nuxt.js 依据 pages 目录结构自动生成 vue-router 模块的路由配置。

基础路由

假设 pages 的目录结构如下:

  1. pages/
  2. --| user/
  3. -----| index.vue
  4. -----| one.vue
  5. --| index.vue

那么,Nuxt.js 自动生成的路由配置如下:

  1. router: {
  2. routes: [
  3. {
  4. name: 'index',
  5. path: '/',
  6. component: 'pages/index.vue'
  7. },
  8. {
  9. name: 'user',
  10. path: '/user',
  11. component: 'pages/user/index.vue'
  12. },
  13. {
  14. name: 'user-one',
  15. path: '/user/one',
  16. component: 'pages/user/one.vue'
  17. }
  18. ]
  19. }

动态路由

在 Nuxt.js 里面定义带参数的动态路由,需要创建对应的以下划线作为前缀的 Vue 文件 或 目录。

以下目录结构:

  1. pages/
  2. --| _slug/
  3. -----| comments.vue
  4. -----| index.vue
  5. --| users/
  6. -----| _id.vue
  7. --| index.vue

Nuxt.js 生成对应的路由配置表为:

  1. router: {
  2. routes: [
  3. {
  4. name: 'index',
  5. path: '/',
  6. component: 'pages/index.vue'
  7. },
  8. {
  9. name: 'users-id',
  10. path: '/users/:id?',
  11. component: 'pages/users/_id.vue'
  12. },
  13. {
  14. name: 'slug',
  15. path: '/:slug',
  16. component: 'pages/_slug/index.vue'
  17. },
  18. {
  19. name: 'slug-comments',
  20. path: '/:slug/comments',
  21. component: 'pages/_slug/comments.vue'
  22. }
  23. ]
  24. }

你会发现名称为 users-id 的路由路径带有 :id? 参数,表示该路由是可选的。如果你想将它设置为必选的路由,需要在 users/_id 目录内创建一个 index.vue 文件。

路由参数校验

Nuxt.js 可以让你在动态路由组件中定义参数校验方法。

举个例子: pages/users/_id.vue

  1. export default {
  2. validate ({ params }) {
  3. // Must be a number
  4. return /^\d+$/.test(params.id)
  5. }
  6. }

如果校验方法返回的值不为 true, Nuxt.js 将自动加载显示 404 错误页面。

想了解关于路由参数校验的信息,请参考 页面校验API

嵌套路由

你可以通过 vue-router 的子路由创建 Nuxt.js 应用的嵌套路由。

创建内嵌子路由,你需要添加一个 Vue 文件,同时添加一个与该文件同名的目录用来存放子视图组件。

别忘了在父级 Vue 文件内增加 <nuxt-child/> 用于显示子视图内容。

假设文件结构如:

  1. pages/
  2. --| users/
  3. -----| _id.vue
  4. -----| index.vue
  5. --| users.vue

Nuxt.js 自动生成的路由配置如下:

  1. router: {
  2. routes: [
  3. {
  4. path: '/users',
  5. component: 'pages/users.vue',
  6. children: [
  7. {
  8. path: '',
  9. component: 'pages/users/index.vue',
  10. name: 'users'
  11. },
  12. {
  13. path: ':id',
  14. component: 'pages/users/_id.vue',
  15. name: 'users-id'
  16. }
  17. ]
  18. }
  19. ]
  20. }

动态嵌套路由

这个应用场景比较少见,但是 Nuxt.js 仍然支持:在动态路由下配置动态子路由。

假设文件结构如下:

  1. pages/
  2. --| _category/
  3. -----| _subCategory/
  4. --------| _id.vue
  5. --------| index.vue
  6. -----| _subCategory.vue
  7. -----| index.vue
  8. --| _category.vue
  9. --| index.vue

Nuxt.js 自动生成的路由配置如下:

  1. router: {
  2. routes: [
  3. {
  4. path: '/',
  5. component: 'pages/index.vue',
  6. name: 'index'
  7. },
  8. {
  9. path: '/:category',
  10. component: 'pages/_category.vue',
  11. children: [
  12. {
  13. path: '',
  14. component: 'pages/_category/index.vue',
  15. name: 'category'
  16. },
  17. {
  18. path: ':subCategory',
  19. component: 'pages/_category/_subCategory.vue',
  20. children: [
  21. {
  22. path: '',
  23. component: 'pages/_category/_subCategory/index.vue',
  24. name: 'category-subCategory'
  25. },
  26. {
  27. path: ':id',
  28. component: 'pages/_category/_subCategory/_id.vue',
  29. name: 'category-subCategory-id'
  30. }
  31. ]
  32. }
  33. ]
  34. }
  35. ]
  36. }

过渡动效

Nuxt.js 使用 Vue.js 的<transition>组件来实现路由切换时的过渡动效。

全局过渡动效设置

Nuxt.js 默认使用的过渡效果名称为 page

如果想让每一个页面的切换都有淡出 (fade) 效果,我们需要创建一个所有路由共用的 CSS 文件。所以我们可以在 assets/ 目录下创建这个文件:

在全局样式文件 assets/main.css 里添加一下样式:

  1. .page-enter-active, .page-leave-active {
  2. transition: opacity .5s;
  3. }
  4. .page-enter, .page-leave-active {
  5. opacity: 0;
  6. }

然后添加到 nuxt.config.js 文件中:

  1. module.exports = {
  2. css: [
  3. 'assets/main.css'
  4. ]
  5. }

关于过渡效果 transition 属性配置的更多信息可参看 页面过渡效果API

页面过渡动效设置

如果想给某个页面自定义过渡特效的话,只要在该页面组件中配置 transition 字段即可:

在全局样式 assets/main.css 中添加一下内容:

  1. .test-enter-active, .test-leave-active {
  2. transition: opacity .5s;
  3. }
  4. .test-enter, .test-leave-active {
  5. opacity: 0;
  6. }

然后我们将页面组件中的 transition 属性的值设置为 test 即可:

  1. export default {
  2. transition: 'test'
  3. }

关于过渡效果 transition 属性配置的更多信息可参看 页面过渡效果API

中间件

中间件允许您定义一个自定义函数运行在一个页面或一组页面渲染之前。

每一个中间件应放置在 middleware/ 目录。文件名的名称将成为中间件名称(middleware/auth.js将成为 auth 中间件)。

一个中间件接收 context 作为第一个参数:

  1. export default function (context) {
  2. context.userAgent = context.isServer ? context.req.headers['user-agent'] : navigator.userAgent
  3. }

中间件执行流程顺序:

  1. nuxt.config.js
  2. 匹配布局
  3. 匹配页面

中间件可以异步执行,只需要返回一个 Promise 或使用第2个 callback 作为第一个参数:

middleware/stats.js

  1. import axios from 'axios'
  2. export default function ({ route }) {
  3. return axios.post('http://my-stats-api.com', {
  4. url: route.fullPath
  5. })
  6. }

然后在你的 nuxt.config.js 、 layouts 或者 pages 中使用中间件:

nuxt.config.js

  1. module.exports = {
  2. router: {
  3. middleware: 'stats'
  4. }
  5. }

stats 中间件将在每个路由改变时被调用。

如果你想看到一个使用中间件的真实例子,请参阅在 GitHub 上的example-auth0