路由是SPA单页面应用中必不可少的一部分,学好路由的使用也是学习 Vue 这门框架必备的技能之一。今天就给大家分享一下vue-router 路由配置、跳转与传参。
本文所述的 vue-router 版本为 3.0.6。
import Discussion from '../components/Discussion.vue';
import MyInfo from '../components/MyInfo.vue';
import Index from '../components/Index.vue';
import Login from '../components/Login.vue';
export default {
routes: [
{path: '/', redirect: '/index'},
{path: '/index', name: 'index', component: Index},
{path: '/discussion', name: 'discussion', component: Discussion},
{path: '/myInfo', name: 'myInfo', component: MyInfo},
{path: '/login', name: 'login', component: Login},
],
mode: "history"
};
{path: '/', redirect: '/index'},
{path: '/index', name: 'index', component: Index},
路由跳转有两种方式。
<template xmlns:v-bind="http://www.w3.org/1999/xhtml">
<div id="app">
<div class="tab-position common-flex common-flex-jc-sa">
<router-link v-for="(item,index) in tabList"
:to="item.name"
>
{{item.title}}
router-link>
div>
<router-view>router-view>
div>
template>
<script>
import './css/common.css';
let self;
export default {
data(){
return{
tabList:[
{title:'首页',name:'index'},
{title:'论坛',name:'discussion'},
{title:'我的',name:'myInfo'}
]
}
},
}
</script>
这种方式只适合做单纯的跳转,也可以带参数,但做不了其他的逻辑处理。比如切换不同的 tab,不仅要跳到相应的组件页面,还需要修改 tab 样式。
<template xmlns:v-bind="http://www.w3.org/1999/xhtml">
<div id="app">
<div class="tab-position common-flex common-flex-jc-sa">
<div v-for="(item,index) in tabList"
@click="tab(item,index)"
:class="[tabIndex == index ? activeTitle: activeTitleNo]"
>
{{item.title}}
div>
div>
<router-view>router-view>
div>
template>
<script>
import './css/common.css';
let self;
export default {
data(){
return{
tabList:[
{title:'首页',name:'index'},
{title:'论坛',name:'discussion'},
{title:'我的',name:'myInfo'}
],
tabIndex:0,
activeTitle:'active-title',
activeTitleNo:'active-title-no',
}
},
created(){
self = this;
},
methods:{
changeTab:(item,index)=>{
self.tabIndex = index;
self.$router.push({name:item.name});
},
}
}
</script>
上面有提到两种路由跳转方式,相应的路由传参也有两种方式。
<template xmlns:v-bind="http://www.w3.org/1999/xhtml">
<div id="app">
<div class="tab-position common-flex common-flex-jc-sa">
<router-link v-for="(item,index) in tabList"
:to="{path:item.name,param:{id:item.id}}"
>
{{item.title}}
router-link>
div>
<router-view>router-view>
div>
template>
使用 router-link 进行配置,使用 to 属性进行跳转。
<template xmlns:v-bind="http://www.w3.org/1999/xhtml">
<div id="app">
<div class="tab-position common-flex common-flex-jc-sa">
<div v-for="(item,index) in tabList"
@click="changeTab(item,index)"
:class="[tabIndex == index ? activeTitle: activeTitleNo]"
>
{{item.title}}
div>
div>
<router-view>router-view>
div>
template>
<script>
import './css/common.css';
let self;
export default {
data(){
return{
tabList:[
{title:'首页',name:'index',id:0},
{title:'论坛',name:'discussion',id:1},
{title:'我的',name:'myInfo'id:2}
],
tabIndex:0,
activeTitle:'active-title',
activeTitleNo:'active-title-no',
}
},
methods:{
changeTab:(item,index)=>{
self.tabIndex = index;
self.$router.push({name:item.name,param:{id:item.id}});
},
}
}
</script>
这种方式就可以修改跳转对应的 tab 样式,使其成激活状态。
需要注意的是不管是第1种还是第2种,其下方都只需要配置一个 router-view 组件,表示对应的组件内容。
http://localhost:8080/discussion?id=1
created(){
console.log(this.$route.param)
}
注意这里获取参数的时候是 this. r o u t e 。 而 路 由 跳 转 的 时 候 是 t h i s . route。而路由跳转的时候是 this. route。而路由跳转的时候是this.router.push。一个是 $route,一个是 $router。
this.$router.push({name:item.name,param:{id:item.id}});