Vue SSR 项目 Nuxt.js 框架之《路由》

# 前言

本篇文章主要介绍nuxt的路由,包括一级路由二级路由三级路由...等,以及对应等级路由的创建方式和文件及文件夹创建的规则,因为nuxt是约定式路由,当然也支持路由配置,接下来就让我们逐步探讨一下 ( 官网文档 )。

# 约定式路由

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

例如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'
    }
  ]
}

Vue中有模板文件app.vue,在nuxtlayouts文件夹中的default.vue文件与之类似,只是名字略有不同。而模板文件中的<nuxt />就相当于Vue中的<router-view>路由容器

# 一级路由

pages文件夹下创建的一级文件都是一级路由,因nuxt约定式路由,文件按规则创建后,直接访问文件名即可跳转至目标路由。

举个栗子

pages下创建index.vueabout.vue俩页面

pages/
 --| about.vue
 --| index.vue

模板文件default.vue文件中写入以下代码

<template>
  <div>
    <nuxt-link to="/home"> 首页 </nuxt-link>
    <nuxt-link to="/about"> 关于我们 </nuxt-link>
    <Nuxt />
  </div>
</template>

如上:与Vue类似,也有声明式导航<nuxt-link>,其用法与<router-link>一样。而访问一级路由的路径名称就是一级文件的文件名即路径为/文件名,以此类推可创建其他的一级文件。

# 二级路由/嵌套路由

因为nuxt约定式路由,所以二级路由就是在pages文件夹下创建一个与一级文件同名的文件夹,在这个文件夹下创建的二级文件就会默认配置为二级路由。其访问路径同一级路由类似即/一级文件名/二级文件名

举个栗子,如下图

1644914954(1).png

如上,goods.vue为一级路由文件,访问地址为<nuxt-link to="/goods">。创建与一级路由文件同名的文件夹goods,在goods文件下又创建了list.vue文件。这个list.vue就是一级路由/goods二级路由文件,访问地址为<nuxt-link to="/goods/list">

这时访问/goods/list报了404错误,为什么会找不到页面呢?其实这种创建二级路由文件有一个不好的地方:在访问/goods/list时会首先访问goods文件下的index.vue文件,此时没有这文件所以就会报错。解决办法就是在goods文件夹下创建一个空的index.vue文件即可。

1644916079(1).png

创建完之后再次访问/goods/list,哇哦,这次没有报错但页面没有出来,这又是什么鬼???

原因也很简单:就是在一级路由文件goods.vue文件中没有没有放置二级路由( 或是子路由 )的路由容器,所有nuxt不知道将二级路由放置在哪如何显示。

<template>
    <div>
        我是商品类别列表
        <nuxt-link to="/goods/list">某类别商品列表 </nuxt-link>
        <!-- 子路由的路由容器 -->
        <nuxt-child />
    </div>
</template>

加上子路由的路由容器<nuxt-child />之后就可以正常展示了。

在一般情况下,我们需要创建二级路由时,都会把一级路由也放在文件夹里,这样比较好管理。但需要注意的是:一级路由与二级路由在同一个文件夹时,一级路由的文件名不再是和文件夹的同名而是index.vue。这与nuxt的约定式路由有关系:在pages文件夹下创建的一级文件夹下的index.vue默认为一级路由,访问路径为/一级文件夹名称

还是以goods为例:

复制一级路由文件goods.vue的内容到goods文件夹下index.vue中,之后删除一级路由文件goods.vue,如下图:

image.png

可以看到已经没有了一级路由文件goods.vue,代替它的是goods文件下的index.vue文件,此时想要访问一级路由goods,路径仍为<nuxt-link to="/goods">

值得注意的是:路径/goods访问的是goods文件夹的index.vue文件,切记,切记,切记

友情提示:平时在创建二级路由的时候,推荐第二种方法( 可根据项目和具体需要而定 )。

# 动态路由

Vue中声明动态路由一般为path: /detail/:id,即可以向动态路由/detail/传不同的id值以便查询不同的id值下的详情信息,如:/detail/1/detail/2/detail/3等等。

nuxt中声明动态路由与Vue略有不同,Vue是以/:id为标识为此路由为动态路由,传参的keyid。而在nuxt中需要创建一个文件即_id.vue,以_表示此路由为动态路由,传参的key**_**后边的值即id

还是以goods为例

goods文件夹下创建_id.vue文件,标识为goods的动态路由,用于查询goods的详情,结构如下图:

1644919298(1).png

list.vue中写如下代码即可跳转至动态路由文件_id.vue中:

<template>
    <div>
        我是某类别商品列表
        <nuxt-link to="/goods/1">详情 </nuxt-link>
    </div>
</template>

怎么拿到参数值呢?其实也和Vue类似也是在params中,不同的是nuxt是在validate函数里,如下:

<script>
    export default {
        validate({params}){
            console.log("参数为:" + params.id)
            return
        }
    }
</script>

# 扩展路由/路由重定向

现在项目的端口是8000,但访问localhost:8000是报404错误找不到页面,必须访问localhost:8000/home才能看到首页。想要类似Vue那样,把路径//home都定向到页面home.vue改如何做呢??

这时就用到了nuxt的扩展路由的配置,在nuxt.config.js配置文件

export default {
    router: {
        middleware: 'auth.js',
        // 扩展路由
        extendRoutes(routes, resolve) {
            // 路由重定向
           // routes.push({
            //     path: '/', // 法一
            //     redirect: '/home'
            // });
            routes.push({
                name: 'home', // 法二
                path: '/',
                component: resolve(__dirname, 'pages/home.vue')
            })
        }
    }
}

此时再访问localhost:8000地址就可跳转至home.vue页面了
如果想访问localhost:8000/index时也跳转至home.vue,同样在nuxt.config.js配置文件配置即可

export default {
    router: {
        middleware: 'auth.js',
        // 扩展路由
        extendRoutes(routes, resolve) {
            // 路由重定向
            // routes.push({
            //     path: '/', // 法一
            //     redirect: '/home'
            // });
            routes.push({
                name: 'home', // 法二
                path: '/',
                component: resolve(__dirname, 'pages/home.vue')
            });
            // 路由重命名
            routes.push({
                name: 'index',
                path: '/index',
                component: resolve(__dirname, 'pages/home.vue')
            })
        }
    }
}

友情提示:利用中间件middleware也可以实现,咱们敬请期待~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容