nuxtjs全栈

2020-02-25 15:15:56

nuxtjs路由设置,二级路由,多级路由,多个参数

参考地址 nuxtjs路由


路由

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

要在页面之间使用路由,我们建议使用<nuxt-link> 标签。

例如:

<template>
  <nuxt-link to="/">首页</nuxt-link></template>

基础路由

假设 pages 的目录结构如下:

pages/
--| user/
-----| index.vue
-----| one.vue
--| index.vue

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

router: {  routes: [
    {      name: 'index',      path: '/',      component: 'pages/index.vue'
    },
    {      name: 'user',      path: '/user',      component: 'pages/user/index.vue'
    },
    {      name: 'user-one',      path: '/user/one',      component: 'pages/user/one.vue'
    }
  ]
}

动态路由

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

观看Vue School出品的 动态路由 免费课程

以下目录结构:

pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| users/
-----| _id.vue
--| index.vue

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

router: {  routes: [
    {      name: 'index',      path: '/',      component: 'pages/index.vue'
    },
    {      name: 'users-id',      path: '/users/:id?',      component: 'pages/users/_id.vue'
    },
    {      name: 'slug',      path: '/:slug',      component: 'pages/_slug/index.vue'
    },
    {      name: 'slug-comments',      path: '/:slug/comments',      component: 'pages/_slug/comments.vue'
    }
  ]
}

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

:API Configuration generate

警告:generate 命令会忽略动态路由: API Configuration generate

路由参数校验

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

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

export default {
  validate ({ params }) {    // 必须是number类型
    return /^\d+$/.test(params.id)
  }
}

如果校验方法返回的值不为 truePromise中resolve 解析为false或抛出Error , Nuxt.js 将自动加载显示 404 错误页面或 500 错误页面。

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

嵌套路由

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

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

Warning: 别忘了在父组件(.vue文件) 内增加 <nuxt-child/> 用于显示子视图内容。

假设文件结构如:

pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue

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

router: {  routes: [
    {      path: '/users',      component: 'pages/users.vue',      children: [
        {          path: '',          component: 'pages/users/index.vue',          name: 'users'
        },
        {          path: ':id',          component: 'pages/users/_id.vue',          name: 'users-id'
        }
      ]
    }
  ]
}

动态嵌套路由

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

假设文件结构如下:

pages/
--| _category/
-----| _subCategory/
--------| _id.vue
--------| index.vue
-----| _subCategory.vue
-----| index.vue
--| _category.vue
--| index.vue

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

router: {  routes: [
    {      path: '/',      component: 'pages/index.vue',      name: 'index'
    },
    {      path: '/:category',      component: 'pages/_category.vue',      children: [
        {          path: '',          component: 'pages/_category/index.vue',          name: 'category'
        },
        {          path: ':subCategory',          component: 'pages/_category/_subCategory.vue',          children: [
            {              path: '',              component: 'pages/_category/_subCategory/index.vue',              name: 'category-subCategory'
            },
            {              path: ':id',              component: 'pages/_category/_subCategory/_id.vue',              name: 'category-subCategory-id'
            }
          ]
        }
      ]
    }
  ]
}

未知嵌套深度的动态嵌套路由

如果您不知道URL结构的深度,您可以使用_.vue动态匹配嵌套路径。这将处理与更具体请求不匹配的情况。

文件结构:

pages/
--| people/
-----| _id.vue
-----| index.vue
--| _.vue
--| index.vue

将处理这样的请求:

PathFile
/index.vue
/peoplepeople/index.vue
/people/123people/_id.vue
/about_.vue
/about/careers_.vue
/about/careers/chicago_.vue

Note: 处理404页面,现在符合_.vue页面的逻辑。 有关404重定向的更多信息,请点击此处.

命名视图

要渲染命名视图,您可以在布局(layout) / 页面(page)中使用 <nuxt name="top"/> 或 <nuxt-child name="top"/> 组件。要指定页面的命名视图,我们需要在nuxt.config.js文件中扩展路由器配置:

export default {  router: {
    extendRoutes (routes, resolve) {      const index = routes.findIndex(route => route.name === 'main')
      routes[index] = {
        ...routes[index],        components: {          default: routes[index].component,          top: resolve(__dirname, 'components/mainTop.vue')
        },        chunkNames: {          top: 'components/mainTop'
        }
      }
    }
  }
}

它需要使用两个属性 components 和 chunkNames 扩展路由。此配置示例中的命名视图名称为 top 。看一个例子:命名视图 例子

SPA fallback

您也可以为动态路由启用SPA fallback。在使用mode:'spa'模式下,Nuxt.js将输出一个与index.html相同的额外文件。如果没有文件匹配,大多数静态托管服务可以配置为使用SPA模板。生成文件不包含头信息或任何HTML,但它仍将解析并加载API中的数据。

我们在nuxt.config.js文件中启用它:

export default {  generate: {    fallback: true, // if you want to use '404.html'
    fallback: 'my-fallback/file.html' // if your hosting needs a custom location
  }
}

在Surge上实现

Surge 可以处理200.html 和 404.htmlgenerate.fallback默认设置为200.html,因此无需更改它。

在 GitHub Pages 和 Netlify 上实现

GitHub Pages 和 Netlify 自动识别 404.html文件,所以我们需要做的就是将 generate.fallback 设置为 true

在 Firebase Hosting 上实现

要在Firebase Hosting上使用,请将 generate.fallback 配置为 true 并使用以下配置(more info):

{  "hosting": {    "public": "dist",    "ignore": [      "firebase.json",      "**/.*",      "**/node_modules/**"
    ],    "rewrites": [
      {        "source": "**",        "destination": "/404.html"
      }
    ]
  }
}

过渡动效

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

全局过渡动效设置

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

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

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

.page-enter-active, .page-leave-active {  transition: opacity .5s;
}.page-enter, .page-leave-active {  opacity: 0;
}

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

module.exports = {  css: [    'assets/main.css'
  ]
}

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

页面过渡动效设置

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

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

.test-enter-active, .test-leave-active {  transition: opacity .5s;
}.test-enter, .test-leave-active {  opacity: 0;
}

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

export default {  transition: 'test'}

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

中间件

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

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

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

export default function (context) {
  context.userAgent = process.server ? context.req.headers['user-agent'] : navigator.userAgent
}

中间件执行流程顺序:

  1. nuxt.config.js

  2. 匹配布局

  3. 匹配页面

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

middleware/stats.js

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

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

nuxt.config.js

module.exports = {  router: {    middleware: 'stats'
  }
}

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

您也可以将 middleware 添加到指定的布局或者页面:

pages/index.vue 或者 layouts/default.vue

export default {  middleware: 'stats'}

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


  • 2018-08-07 20:00:42

    xUtils3.0版本的发送同步网络请求的方式

    对于Android开发来说,基本都是用异步来从网络上请求数据,很少用到同步请求的。近日项目有个地方需要使用到同步请求(以我目前的知识储备来说好像只能用同步请求来解决这个问题了),去网上搜索相关资料,又没有找到什么明确的使用方法。所以记下来,以备不时之需。

  • 2018-08-14 23:35:28

    Retrofit 设置 超时时间

    今天开发的时候遇到一个网络请求超时的问题,后台处理是成功的,但是移动端返回的总是提示请求超时,在设置了retrofit请求超时的时间延长以后,就可以请求成功了,下面是配置的方法:

  • 2018-08-16 16:10:43

    Laravel 跨域解决方案

    我们在用 laravel 进行开发的时候,特别是前后端完全分离的时候,由于前端项目运行在自己机器的指定端口(也可能是其他人的机器) , 例如 localhost:8000 , 而 laravel 程序又运行在另一个端口,这样就跨域了,而由于浏览器的同源策略,跨域请求是非法的。其实这个问题很好解决,只需要添加一个中间件就可以了。

  • 2018-08-18 20:30:12

    laravel5.5 路由分割成不同文件

    routes.php/api.php文件用来放置laravel路由,当项目越来越大,相应的路由文件也会越来越多。如果能够将不同功能的路由分割到不同的文件,那么对以后的维护将很有帮助。

  • 2018-08-20 15:26:19

    关于OnTouch 和OnClick同时调用冲突的解决方案

    大家在搞轮播图的时候会碰到这样的情况,点击进入webview界面,长按轮播图停止轮播,手松开图又开始轮播,这里就涉及到了OnTouch 和OnClick同时调用。两者是有冲突的。这里简单介绍,给大家提供思路。

  • 2018-08-20 15:29:11

    揭开RecyclerView的神秘面纱(二):处理RecyclerView的点击事件

    主要讲述了RecyclerView的基本使用方法,不同的布局管理器而造成的多样化展示方式,展示了数据之后,一般都会与用户进行交互,因此我们需要处理用户的点击事件。在ListView和GridView提供了onItemClickListener这个监听器,然而我们查找RecyclerView的API却没有类似的监听器,因此我们需要自己手动处理它的点击事件。 以下提供两种方法来实现处理RecyclerView点击事件的功能,以下代码均基于上一篇文章的代码做出修改。

  • 2018-08-20 22:58:46

    onInterceptTouchEvent和onTouchEvent调用关系详解 ...

    老实说,这两个小东东实在是太麻烦了,很不好懂,我自己那api文档都头晕,在网上找到很多资料,才知道是怎么回事,这里总结一下,记住这个原则就会很清楚了:

  • 2018-08-23 15:32:18

    map对象拷贝问题

    最后面是使用序列化的方式,发现,更改引用类型的数据的时候,mapNew对象并没有发生变化,所以产生了深拷贝。 上述的工具类,可以实现对象的深拷贝,不仅限于HashMap,前提是实现了Serlizeable接口。