Vue学习碎片之路由VueRouter

VueRouter安装

  • Vue路由vue-router是官方的路由插件,能够轻松的管理SPA项目中组件的切换
  • Vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来
  • vue-router目前有3.x版本和4.x版本,vue-router 3.x只能结合vue2进行使用,vue-router 4.x只能结合vue3进行使用
  • 安装:npm install vue-router@3或4

路由使用

以网易云音乐为例
app.vue:

<template>
  <div id="app">
    <router-link to="/discover">发现音乐</router-link>
    <router-link to="/my">我的音乐</router-link>
    <router-link to="/friends">关注</router-link>
    <router-view></router-view>
  </div>
</template>

main.js:

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  router
}).$mount('#app')

router文件夹下的index.js:

import VueRouter from "vue-router";
import Vue from "vue";
import DiscoverPage from "@/components/DiscoverPage.vue";
import FriendsPage from "@/components/FriendsPage.vue";
import MyMusic from "@/components/MyMusic.vue";
import TopList from "@/components/TopList.vue";
import PlayList from "@/components/PlayList.vue";
Vue.use(VueRouter)

const router = new VueRouter({
    routes:[
        {path:'/', redirect:"/discover"},
        {path:'/discover', 
        component:DiscoverPage,
        children:[
            {path:'toplist', component:TopList},
            {path:'playlist', component:PlayList},
        ]
    },
        {path:'/friends', component:FriendsPage},
        {path:'/my', component:MyMusic},
    ]
})

export default router

components文件夹下的组件:
DiscoverPage.vue:

<template>
    <div>
        <h1>发现音乐</h1>
        <router-link to="/discover/toplist">推荐</router-link>
        <router-link to="/discover/playlist">歌单</router-link>
        <hr>
        <router-view></router-view>
    </div>
</template>

FriendsPage.vue:

<template>
    <div>
        <h1>关注</h1>
    </div>
</template>

MyMusic.vue:

<template>
    <div>
        <h1>我的音乐</h1>
    </div>
</template>

TopList.vue:

<template>
    <h3>推荐</h3>
</template>

PalyList.vue:

<template>
    <h3>歌单</h3>
</template>

页面显示如下
在这里插入图片描述

动态路由

MyMusic.vue:

<template>
    <div>
        <h1>我的音乐</h1>
        <router-link to="/my/1">商品1</router-link>
        <router-link to="/my/2">商品2</router-link>
        <router-link to="/my/3">商品3</router-link>
        <router-view></router-view>
    </div>
</template>

router文件夹下的index.js:

import VueRouter from "vue-router";
import Vue from "vue";
import DiscoverPage from "@/components/DiscoverPage.vue";
import FriendsPage from "@/components/FriendsPage.vue";
import MyMusic from "@/components/MyMusic.vue";
import TopList from "@/components/TopList.vue";
import PlayList from "@/components/PlayList.vue";
import ProductPage from "@/components/ProductPage.vue";
Vue.use(VueRouter)

const router = new VueRouter({
    routes:[
        {path:'/', redirect:"/discover"},
        {path:'/discover', 
        component:DiscoverPage,
        children:[
            {path:'toplist', component:TopList},
            {path:'playlist', component:PlayList},
        ]
    },
        {path:'/friends', component:FriendsPage},
        {path:'/my', 
        component:MyMusic,
        children:[
            {path:':id', component:ProductPage},
        ]
    },
    ]
})

export default router

components文件夹下的ProductPage.vue:

<template>
<h3>商品{{ $route.params.id }}</h3>
</template>

以属性的方式获取路由参数

为了简化路由参数的获取形式,vue-router允许在路由规则中开启props传参。示例代码如下

{ path: '/product/:id', component: ProductPage, props: true }

ProductPage.vue:

<template>
<h3>商品{{ id }}</h3>
</template>

<script>
export default {
    props:["id"]
}
</script>

路由守卫

路由守卫可以控制路由的访问权限,全局路由守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制。
你可以使用router.beforEach注册一个全局前置守卫:

router.beforEach((to, from, next) => {
	if(to.path === '/main' && !isAuthenticated){
		next('/login')
	}
	else{
		next()
	}
})
  • to:即将要进入的目标
  • from:当前导航正要离开的路由
  • 在守卫方法中如果声明了next形参,则必须调用next()函数,否则不允许用户访问任何一个路由!
  • 直接放行:next()
  • 强制其停留在当前页面:next(false)
  • 强制其跳转到登录页面:next(‘/login’)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值