目录
1、安装
VUE CLI可以选择安装,如果没有安装则运行以下命令
$ npm install vue-router --save --save-exact
路由组件的设定-仅两步
1、src/router/index.js --- 路由的配置文件,做组件映射
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld //这里HelloWorld是第三行导入的组件
}
]
})
2、src/main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import 'bootstrap/dist/css/bootstrap.min.css'
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,//将router里的index.js在VUE中进行注册
components: { App },
template: '<App/>'
})
2、第一个例子
做一个简单的路由
涉及文件:
* HelloWorld.vue
* News.vue
* About.vue
* router/index.js
* App.vue
### HelloWorld.vue
<template>
<div>
<h1>Hello World!</h1>
</div>
</template>
### News.vue
<template>
<div>
<h1>News Page</h1>
</div>
</template>
### About.vue
<template>
<div>
<h1>About Page</h1>
</div>
</template>
### router/index.js
添加路由
当URL是根URL /,绑定组件HelloWorld;
当URL是/about,绑定组件About
import About from '@/components/About'
import News from '@/components/News'
...
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
},
{
path: '/about',
name: 'About',
component: About
},
{
path: '/news',
name: 'News',
component: News
}
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import News from '@/components/News'
import About from '@/components/About'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld //这里HelloWorld是第三行导入的组件
},
{
path: '/news',
name: 'News',
component: News
},
{
path: '/about',
name: 'About',
component: About
}
]
})
### App.vue
<router-link to="URL"></router-link> 这里的(/、/news、/about在index.js中进行了路由映射)实际效果是在页面渲染出页面链接,渲染到 <router-view/>中进行显示
<template>
<div id="app">
<img src="./assets/logo.png">
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/">Home</router-link>
<router-link to="/news">新闻</router-link>
<router-link to="/about">关于</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view/>
</div>
</template>
<script>
import './assets/my.css'
export default {
name: 'App'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
3、动态路由
动态路由是指在URL路径中含有动态参数的路由,比如说:/player/1, /player/2, /player/3等等。同一个组件,传的参数不同,显示的内容不同
## 实战演习
定制玩家的动态路径:/player/:id
* Player.vue
* router/index.js
* App.vue
### Player.vue
<template>
<div>
<h1>球员页面</h1>
<p>{{ detail }}</p>
</div>
</template>
<script>
export default {
name: "Player",
data() {
return {
detail: {}
};
},
mounted() {
//当组件初始化完成时
// 接受url参数id
this.detail = this.getPlayer(this.$route.params.uid);
},
beforeRouteUpdate(to, from, next) {
//当从非首页点击其他路由时,重新设置detail的信息
//关于此处详细原因 视频地址:https://www.bilibili.com/video/av24419291/?p=12
this.detail = this.getPlayer(to.params.uid);
next();
},
methods: {
getPlayer(uid) {
switch (uid) {
case '1':
return {uid: 1,name: '库里',point: 26};
case '2':
return {uid: 2,name: '哈登',point: 30};
default:
return {uid: -1};
}
}
}
};
</script>
### router/index.js
加入以下内容
...
import Player from '@/components/Player'
...
export default new Router({
routes: [
{
path: '/player/:uid',
name: 'Player',
component: Player
}
]
})
通过URL把参数传给mounted,然后再通过getPlayer()的switch 进行判断
### App.vue
添加以下内容
<template>
<div id="app">
<p>
<router-link to="/">Home</router-link>
<router-link to="/player/1">库里</router-link>
<router-link to="/player/2">哈登</router-link>
</p>
<router-view/>
</div>
</template>
结合上一张图看
结果
4、嵌套路由
嵌套路由是指在动态路由的基础上再加上附加的嵌套URL(即:组件),比如说:(/player/:uid/*)/player/1/profile, /player/1/stats等。表示球员1的简介信息、数据。
这里是要在球员组件里添加球员信息和球员数据的子路由
## 实战演习
* Player/Profile.vue
* Player/Stats.vue
* router/index.js
* Player.vue
### Player/Profile.vue
<template>
<div>
<h2>球员简介:{{$route.params.uid}}</h2>
</div>
</template>
### Player/Stats.vue
<template>
<div>
<h2>球员数据:{{$route.params.uid}}</h2>
</div>
</template>
### router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Player from '@/components/Player'
import PlayerProfile from '@/components/Player/Profile'
import PlayerStats from '@/components/Player/Stats'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld //这里HelloWorld是第三行导入的组件
},
{
path: '/player/:uid',
name: 'Player',
component: Player,
children:[
{
path:'profile',
component:PlayerProfile
},
{
path:'stats',
component:PlayerStats
}
]
},
]
})
### Player.vue
<template>
<div>
<h1>球员页面</h1>
<ul>
<li>编号:{{detail.uid}}</li>
<li>名字:{{detail.name}}</li>
<li>得分:{{detail.point}}</li>
</ul>
<!-- 当点击profile、stats时,组件会自动渲染到<router-view>中 -->
<router-link :to="profile">简介</router-link>
<router-link :to="stats">数据</router-link>
<hr>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: "Player",
data() {
return {
detail: {},
profile:'',
stats:''
};
},
mounted() {
//当组件初始化完成时
// 接受url参数id
this.detail = this.getPlayer(this.$route.params.uid);
this.profile = '/player/'+this.$route.params.uid+'/profile';
this.stats = '/player/'+this.$route.params.uid+'/stats';
},
beforeRouteUpdate(to, from, next) {
this.detail = this.getPlayer(to.params.uid);
this.profile='/player/'+to.params.uid+'/profile';
this.stats = '/player/'+to.params.uid+'/stats';
next();
},
methods: {
getPlayer(uid) {
switch (uid) {
case '1':
return {uid: 1,name: '库里',point: 26};
case '2':
return {uid: 2,name: '哈登',point: 30};
default:
return {uid: -1};
}
}
}
};
</script>
结果
5、路由拼图
为一个路由(画面)组合多个组件,完成整个页面。
* router-view[name]
* components
## 实战演习
* Header.vue
* Sidebar.vue
* Detail.vue
* router/index.js
* App.vue
### setting/Header.vue
<template>
<div>
<h1>标题栏</h1>
<div>欢迎来到小马Vue.js课程系列</div>
</div>
</template>
### setting/Sidebar.vue
<template>
<div>
<h1>边条</h1>
</div>
</template>
### setting/Detail.vue
<template>
<div>
<h1>详细显示</h1>
<p>Vue.js是一套用于构建用户界面的渐进式框架。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。</p>
</div>
</template>
### router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import SettingDetail from '@/components/setting/Detail'
import SettingHeader from '@/components/setting/Header'
import SettingSidebar from '@/components/setting/Sidebar'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
components: {
myHeader: SettingHeader,
mySidebar: SettingSidebar,
myDetail: SettingDetail
}
}
]
})
### App.vue
<template>
<div id="app">
<table width="100%">
<tr>
<td colspan="2" style="background-color:darkgoldenrod">
<router-view name="myHeader"></router-view>
</td>
</tr>
<tr>
<td width="20%" style="background-color:thistle">
<router-view name="mySidebar"></router-view>
</td>
<td width="80%" style="background-color:aquamarine">
<router-view name="myDetail"></router-view>
</td>
</tr>
</table>
</div>
</template>
<script>
import "./assets/my.css";
export default {
name: "App"
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
结果
6、重定向及别名
* 重定向指令:redirect
* 路由别名:alias
## 实战演习
* About.vue
* router/index.js
* App.vue
### About.vue
<template>
<div>
<h1>About Page</h1>
</div>
</template>
### router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import SettingDetail from '@/components/setting/Detail'
import SettingHeader from '@/components/setting/Header'
import SettingSidebar from '@/components/setting/Sidebar'
import Player from '@/components/Player'
import PlayerProfile from '@/components/Player/Profile'
import PlayerStats from '@/components/Player/Stats'
import About from '@/components/About'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
components: {
myHeader: SettingHeader,
mySidebar: SettingSidebar,
myDetail: SettingDetail
}
},
{
path: '/player/:uid',
name: 'Player',
component: Player,
children:[
{
path:'profile',
component:PlayerProfile
},
{
path:'stats',
component:PlayerStats
}
]
},
{
path: '/about',
name: 'About',
component: About,
alias: '/aboutme' //输入/aboutme或/about 都访问同样的页面/about
},
{
path: '/curry',//输入/curry就能重定向到/player/1
redirect: '/player/1'
//redirect: { name: 'About' } //重定向到About组件
//redirect: '/about'
}
]
})
### App.vue
<template>
<div id="app">
<router-link to="/">Home</router-link>
<router-link to="/aboutme">About</router-link>
<router-link to="/player/1">Player1</router-link>
<router-link to="/curry">Curry</router-link>
<hr>
<router-view></router-view>
</div>
</template>
<script>
import "./assets/my.css";
export default {
name: "App"
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
7、多参数路由
## 知识点
* 路由属性props
## 实战演习
* User.vue
* router/index.js
* App.vue
### User.vue
<template>
<div>
<h1>User</h1>
<p>uid={{ uid }}, {{ nationality }}</p>
<p>$route.params.uid={{ $route.params.uid }}</p>
<p>$route.params.uid={{ $route.params.nationality }}</p>
</div>
</template>
<script>
export default {
name: "User",
props: ['uid', 'nationality']
};
</script>
### router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import User from '@/components/User'
Vue.use(Router) //将路由组件注册到全局区
//输出类,定义各种URL映射
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
},
{
path: '/user/:uid/:nationality',
name: 'User',
component: User,
props: true
}
]
})
### App.vue
<template>
<div id="app">
<router-link to="/">Home</router-link>
<router-link to="/user/1/usa">User1</router-link>
<router-link to="/user/2/china">User2</router-link>
<router-link to="/user/3/korea">User3</router-link>
<hr>
<router-view></router-view>
</div>
</template>
<script>
import "./assets/my.css";
export default {
name: "App"
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
结果