Vue路由 —— vue-router

  • Post author:
  • Post category:vue



上一篇讲到了Vue中的路由

,在 /router/index.js 中进行路由的配置,使用vue-router完成声明式导航以及讲了路由重定向的问题,路由是Vue中的一个重要内容,那本篇目也讲来继续讲关于路由相关的内容:

嵌套路由

前面讲到了一级路由的配置,那么什么是嵌套路由?把组件嵌套在路由的内部,如下

进入社区分享音乐板块:
/music 是固定的(一级路由)
酷狗音乐分享  :/music/kugou
酷我音乐分享  :/music/kuwo

如果觉得还有点懵,那么就来实现一下这个嵌套路由具体看看:


1) 创建 /views/music 文件夹,以及目录下的两个文件:

/music/KuGou.vue,/music/KuWo.vue

<!-- KuGou.vue -->
<template>
    <div>
        KUGOU —— 酷狗
        <li>第一首</li>
        <li>第二首</li>
        <li>第三首</li>
    </div>
</template>
<!--Kuwo.vue-->
<template>
    <div>
        KUWO —— 酷我
        <li>第一首</li>
        <li>第二首</li>
        <li>第三首</li>
    </div>
</template>


2) 创建 /views/MusicView.vue 文件:

<template>
    <div>
        <h3>分享音乐社区</h3>
        <router-link to="/music/kugou" tag="li" active-class="chosen_cl">分享酷狗Music</router-link>
        <router-link to="/music/kuwo" tag="li" active-class="chosen_cl">分享酷我Music</router-link>
        <router-view></router-view>
    </div>
</template>

<script>
export default {

}
</script>

<style lang="scss">
  .chosen_cl{
    color:skyblue;
    font-weight: bold;
  }
</style>


3)配置 /router/index.js 路由信息:

import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入组件
import Music from '../views/MusicView.vue'
import KuGou from '../views/music/KuGou.vue'
import KuWo from '../views/music/KuWo.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/music'
  },
  {
    path: '/music',
    component: Music,
    children: [
      {
        path: '/kugou',
        component: KuGou
      },
      {
        path: '/kuwo',
        component: KuWo
      }
    ]
  }
]

const router = new VueRouter({
  routes
})

export default router


4)测试运行:

  • 浏览器请求url:http://localhost:8080/#/ 会自动重定向 http://localhost:8080/#/music
  • 点击【分享酷狗Muisc】,请求url路径应为 —— http://localhost:8080/#/music/kugou
  • 点击【分享酷我Music】,请求url路径应为 —— http://localhost:8080/#/music/kuwo
  • 点击对应的板块需要显示对应板块的内容信息



以上就是关于嵌套路由的内容,是否能够更进一步的了解什么是嵌套路由了呢,这里需要注意的也是上一篇内容当中讲到的,路由能够正常的匹配到组件,但如何来让它显示的问题,需要给它留有一个容器让它显示,使用 <router-view> 标签,知道了嵌套路由之后,上一篇就知道了声明式导航,那么本篇内容就来了解编程式导航;

编程式导航

在 /music/KuGou.vue 文件中添加一些歌曲数据信息,通过点击歌曲可以转入播放页,使用的就是接下来要讲的编程式导航,并创建 /views/PlayView.vue 文件(即播放页);

<!-- /views/PlayView.vue -->
<template>
    <div>
        播放界面
    </div>
</template>

<script>
export default {

}
</script>

在 /router/index.js 文件中配置路由信息:

const routes = [
    ...
    {
        path: '/play',
        component: Play
    }
    ...
]
<!-- /views/music/Kugou.vue -->
<template>
    <div>
        KUGOU —— 酷狗
        <li v-for="(song,index) in songlist" :key="song.id" @click="handlePlay()">
                {{index + 1}} —— {{ song.title }}
        </li>
    </div>
</template>

<script>
export default {
  data () {
    return {
      songlist: [{
        id: 10001,
        title: '谪居'
      },
      {
        id: 10002,
        title: '谪仙'
      }]
    }
  },
  methods: {
    handlePlay () {
        location.href = '#/play'
    }
  }
}
</script>

通过 location.href = ‘#/play’ 是可以进入到播放页面的:


那么在 Vue 当中,可以使用什么呢?对了,可以用项目中的路由对象啊 —— router ,在 /router/index.js 中,有如下这段代码将这个对象导出:

...
const router = new VueRouter({
  routes
})

export default router

现在来尝试修改使用 Vue 中提供的方法:

<!-- /views/music/KuGou.vue -->
...
<script>
    ...
    methods: {
        handlePlay () {
            // location.href = '#/play'
            this.$router.push('/play')
        }    
    }
</script>

this.$router.push(‘/play’) 就是路由提供的一种编程式导航!


动态路由

到此之后,如果点击选择要播放的歌曲去跳转到播放页,需要携带一些数据信息,例如id,或者需要其他需要请求歌曲播放的参数,那么在前面的 songlist 模拟数据当中放置了id,现在通过点击选择歌曲之后将 id 一同携带过去;

这里可以知道的是播放页面是固定的,而选择歌曲在播放页播放是不固定的,所以需要通过不同的id在播放页当中来播放不同id所代表的歌曲,那么需要在路由跳转的时候把id携带到播放页,再由播放页中来获取所传过来的 id ;

在 /views/music/KuGou.vue 中编写携带 id 的事件触发:

<!-- /views/music/Kugou.vue -->
<template>
    <div>
        KUGOU —— 酷狗
        <li v-for="(song,index) in songlist" :key="song.id" @click="handlePlay(song.id)">
                {{index + 1}} —— {{ song.title }}
        </li>
    </div>
</template>

<script>
export default {
  ...
  methods: {
    handlePlay (id) {
        this.$router.push(`/play/${id}`)
    }
  }
}
</script>

`/play/${id}` 将 id 拼接在路径 /play 后面;测试运行一下:


那么有人觉得是不是在 /router/index.js 中没有配置该路由的信息呢?可一回顾,如果有成百上千歌曲的话,岂不是要写成百上千的路由啊?仔细想一想这样合理吗?显然不合理!!!怎么解决就是接下来要将的动态路由;

在 /router/index.js 文件中,将路由配置信息中的 ‘/play’ 变更为一个动态路由即可:

const routes = [
    ...
    {
        path: '/play/:id',
        component: Play
    }
    ...
]

/play/:id 就是一个动态的路由了,” : ” 后面添加的名称可以是其他,如 /play/:songId 或者其他都是可以的;(不止可以一个 :id ,如有需要可以是 /play/:id/:title )

那么现在来测试运行一下是否能够正常显示:

接下来在播放页当中来拿到这个歌曲id,即(id为10001),怎么来拿到呢?可以在mounted生命周期中获取到:【注:使用的是 route 而不是 router】

<!-- PlayView.vue -->
...
<script>
export default {
  mounted () {
    console.log(this.$route)
  }
}
</script>

在params下可以看到这个id就是歌曲的id,如果前面我们设置的名称为songId,这里params下的也就是 songId ,拿到这个id就可以去请求对应的歌曲播放链接了;

<!-- PlayView.vue -->
<template>
    <div>
        <h3>播放界面</h3>
        当前歌曲Id —— {{ songId }}
    </div>
</template>
<script>
export default {
  mounted () {
    this.songId = this.$route.params.id
  },
  data () {
    return {
        songId: ''
    }
  }
}
</script>

router 和 route


router 是全局路由对象,而 route 是当前匹配路由的对象

,可以简单的看一下:

以上就是本篇的全部内容了,讲了路由中的嵌套路由、编程式导航和动态路由,以及router和route的区别,那么本篇到此结束,感谢大家的支持!



版权声明:本文为weixin_52203618原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。