一、简介
vue-router是vue.js官方的路由管理器,它和vue.js的核心深度集成,让构建单页面应用变得易如反掌。
2、官方文档:https://router.vuejs.org/zh/。
3、下载安装:npm i vue-router -S(npm install vue-router --save)。
二、配置路由:
1、初始化路由对象,在src目录下创建路由router目录,在router目录下创建路由文件index.js:
// 引入核心组件vue和vue-router,通过vue.use注册vue-router组件
import Vue from 'vue'
import Router from 'vue-router'
// 导入组件
import Home from "../components/Home";
import Reg from "../components/Reg";
// @代表从src目录开始
import User from "@/components/User";
Vue.use(Router)
// 创建vue-router对象,并抛出到全局,提供给main.js调用
export default new Router({
// 设置路由模式为 history,否则会以默认的hash执行,如此的话默认情况下url需要加#
mode: 'history',
// 路由列表,用于注册一个个的路由
routes: [
{
path: '/home', // url路径
component: Home, // 组件名
name: 'Home' // 路由别名
},
{
path: '/reg',
component: Reg,
name: 'Reg'
},
{
path: '/user/:name/:type', // 带路由参数的url
component: User,
name: 'User'
},
]
})
View Code
2、在main.js中把vue-router对象注册到全局:
// 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'
Vue.config.productionTip = false
/* eslint-disable no-new */
// 导入vue-router组件
import router from '@/router/index'
new Vue({
el: '#app',
components: {App},
template: '<App/>',
// 把vue-router组件注册到全局
router
})
View Code
3、在App.vue中引用路由:
<template>
<div id="app">
<!-- 通过router-view引入路由 -->
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App',
components: {}
}
</script>
<style>
</style>
View Code
4、补充:如果在创建vue项目的时候,已经选择设置安装vue-router,则项目会自动帮我们初始化上面的router目录和index.js文件,以及自动到main.js里面注册vue-router对象。
三、页面跳转与传参
1、在全局注册了vue-router组件以后,在全局范围内所有组件里面会创建2个对象给我们使用:
①this.$router:可用于在js代码中进行页面跳转。
②this.$route:可用于获取地址栏上面的url参数。
2、页面跳转的方式:
①通过this.$router.push跳转。
②通过<router-link to=url地址></router-link>或者<router-link :to=url参数></router-link>,实现跳转。
③通过this.$router.go或者this.$router.back或者this.$router.forward,实现历史记录跳转。
3、参数传递:
①查询字符串(query string),就是url的?后面的参数,这些参数不影响路径目的地,例如http://www.xxx.yyy.com/user?name=tom&id=111。
②路由参数(router params),就是url部分斜杠跟着的参数,这些参数是路径的一部分,例如http://www.xxx.yyy.com/user/tom/111。
4、实例:
<template>
<div>
<h1>Home页面</h1>
<button @click="to_reg()">跳转到Reg页面</button>
<br>
<button @click="to_bd()">跳转到百度</button>
<br>
<button @click="up_11()">返回上一页</button>
<br>
<button @click="up_1()">返回上一页</button>
<br>
<button @click="down_1()">前往下一页</button>
<br>
<router-link to="/reg">跳转到Reg页面</router-link>
<br>
<router-link :to="url_reg">跳转到Reg页面</router-link>
<br>
<router-link :to="{path:'/reg'}">跳转到Reg页面</router-link>
<br>
<router-link :to="{name:'Reg'}">跳转到Reg页面</router-link>
<br>
<router-link :to="url">跳转到Reg页面</router-link>
<hr>
<h2>带参数传递的跳转</h2>
<button @click="to_reg_2()">跳转到Reg页面</button>
<br>
<router-link to="/reg?name=tom&age=18">跳转到Reg页面</router-link>
<br>
<router-link :to="{path:'/reg', query:{name:'tom', age:18}}">跳转到Reg页面</router-link>
<br>
<router-link :to="{name:'Reg', query:{name:'tom', age:18}}">跳转到Reg页面</router-link>
<hr>
<router-link to="/user/jan/aaa">跳转到User页面</router-link>
<br>
<router-link :to="{name:'User', params:{name:'jan', type:'aaa'}}">跳转到User页面</router-link>
</div>
</template>
<script>
export default {
name: "Home",
data() {
return {
url_reg: '/reg'
}
},
methods: {
to_reg() {
// 通过this.$router.push跳转指定站内页面,填入url
// 只能站内跳转,站外跳转还是要用window.location.href
this.$router.push('/Reg')
},
to_bd() {
window.location.href = 'https://www.baidu.com/'
},
up_11() {
// 通过this.$router.go(n)跳转历史记录,n为正数是前往,n为负数是返回
this.$router.go(-1)
},
up_1() {
// 通过this.$router.back直接返回上一页
this.$router.back()
},
down_1() {
// 通过this.$router.forward直接前往下一页
this.$router.forward()
},
to_reg_2() {
// 传递query string参数
this.$router.push('/reg?name=tom&age=18')
},
}
}
</script>
<style scoped>
</style>
View Code
<template>
<div>
<h1>Reg页面</h1>
<h3>收到参数:</h3>
<p>{{recv_all}}</p>
<p>{{recv_name}}</p>
<p>{{recv_age}}</p>
<p>{{recv_url_name}}</p>
<p>{{recv_path}}</p>
<p>{{recv_full_path}}</p>
</div>
</template>
<script>
export default {
name: "Reg",
data() {
return {
recv_all: null,
recv_name: null,
recv_age: null,
recv_url_name: null,
recv_path: null,
recv_full_path: null
}
},
created() {
// 通过this.$route.query接收query string参数
this.recv_all = this.$route.query
this.recv_name = this.$route.query.name
this.recv_age = this.$route.query.age
// 通过this.$route.name接收路由别名
this.recv_url_name = this.$route.name
// 通过this.$route.path接收不含query string参数的路径
this.recv_path = this.$route.path
// 通过this.$route.fullPath接收完整路径
this.recv_full_path = this.$route.fullPath
}
}
</script>
<style scoped>
</style>
View Code
<template>
<div>
<h1>User页面</h1>
<h3>收到参数:</h3>
<p>{{recv_all}}</p>
<p>{{recv_name}}</p>
<p>{{recv_type}}</p>
</div>
</template>
<script>
export default {
name: "User",
data() {
return {
recv_all: null,
recv_name: null,
recv_type: null,
}
},
created() {
// 通过this.$route.params接收router params参数
this.recv_all = this.$route.params
this.recv_name = this.$route.params.name
this.recv_type = this.$route.params.type
}
}
</script>
<style scoped>
</style>
View Code