Vue的路由实现有hash模式、history 模式和abstract 模式。根据mode 参数来决定采用哪一种方式。
即地址栏 URL 的#符号,特点:通过 window.onhashchange 的监听, 匹配不同的 url 路径,进行解析,加载不同的组件,然后动态的渲染出区域内的 html 内容,不会被包含在 HTTP 请求中,对后端完全没有影响
HashHistory 两个方法:
HashHistory.push()是将路由添加到浏览器访问历史的栈顶
hashHistory.replace( ) 是替换掉当前栈顶的路由
因为hash 发生变化的url 都会被浏览器历史访问栈记录下来,这样一来, 尽管浏览器没有请求服务器,但是页面状态和 url 一一关联起来的,浏览器还是可以进行前进后退的。
利用了 HTML5 History Interface 中新增的 pushState()和 replaceState()方法。这两个方法应用于浏览器的历史记录栈,提供了对历史记录的修改功能。history 模式不怕页面的前进和后腿,就怕刷新,当刷新时,如果服务器没有相应的响应或者资源,就会刷出 404,而hash 模式不会
Vue路由思维导图:
介绍:Vue Router是Vue.js官方的路由管理器。
Vue Router包含的功能
导入vue文件,为全局window对象挂载Vue构造函数。
导入vue-router文件,为全局window对象挂载VueRouter构造函数。
vue文件必须在vue-router文件之前引入,顺序不能颠倒。
<script src="https://unpkg.com/vue/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
router-link是vue中提供的标签,默认会被渲染为a标签。
to属性默认会被渲染为href属性。
to属性的值默认会被渲染为#开头的hash地址。
<router-link to="/user">userrouter-link>
<router-link to="/register">registerrouter-link>
路由填充位(也叫做路由占位符)。
将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置。
<router-view>router-view>
const user = {
template:'User组件
',
};
const register = {
template:'Register组件
',
};
创建路由VueRouter实例对象
创建路由规则(配置对象)数组routes。
const router = new VueRouter({
// 路由规则
routes:[
{path:'/user',component:User},
{path:'/register',component:Register},
]
})
为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上。
router等同于router:router,是其简写形式。
const app=new Vue({
el:'#box',
router,
});
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue的基本使用title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
head>
<body>
<div id="box">
<router-link to="/user">userrouter-link>
<router-link to="/register">registerrouter-link>
<router-view>router-view>
div>
<script>
// 4、定义路由组件
const User = {
template:'User组件
',
}
const Register = {
template:'Register组件
',
}
// 5、配置路由规则并创建路由实例
const router = new VueRouter({
// 路由规则
routes:[
{path:'/user',component:User},
{path:'/register',component:Register},
]
})
const app=new Vue({
el:'#box',
data:{},
router,
});
script>
body>
html>
说明:表示当用户正在访问地址A的时候,强制用户跳转到地址B,展示特定组件界面。
方法:通过路由规则的redirect属性,指定新路由地址,即可方便的设置路由的重定向。
const router = new VueRouter({
routes:[
{path:'/',redirect:'/user'},
{path:'/user',component:User},
{path:'/register',component:Register},
]
})
效果:在浏览接地址栏内输入path为"/",按回车后,地址跳转到path为"/user"的页面。
实现方式:
路由配置
{
path:'',
components:'',
children:[], //路由配置
}
在组件内增加路由出口
<router-view/>
父级路由链接
父组件路由填充位
<p> <router-link to="/user">Userrouter-link> <router-link to="/register">Registerrouter-link>p><div> <router-view>div>
子级路由链接
子级路由填充位
子级路由组件
const Register = {
template:`
Register组件
Tab1
Tab2
`
}
//子级路由组件
const Tab1 = {
template:'Tab1组件
',
}
const Tab2 = {
template:'Tab2组件
',
}
父级路由通过children属性配置子级路由。
const router = new VueRouter({
routes:[
{path:'/user',component:User},
{
path:'/register',
component:Register,
//通过children属性,为/register添加子级路由规则
children:[
{path:'/register/tab1',component:Tab1},
{path:'/register/tab2',component:Tab2},
]
},
]
})
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue的嵌套路由title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
head>
<body>
<div id="box">
<router-link to="/user">Userrouter-link>
<router-link to="/register">Registerrouter-link>
<router-view>router-view>
div>
<script>
// 4、定义路由组件
const User = {
template: 'User组件
',
}
const Register = {
template: `
Register组件
Tab1
Tab2
`
}
const Tab1 = {
template:'Tab1组件
',
}
const Tab2 = {
template:'Tab2组件
',
}
// 5、配置路由规则并创建路由实例
const router = new VueRouter({
// 路由规则
routes: [
{ path: '/', redirect: '/user' },
{ path: '/user', component: User },
{
path: '/register',
component: Register,
//通过children属性,为/register添加子级路由规则
children: [
{ path: '/register/tab1', component: Tab1 },
{ path: '/register/tab2', component: Tab2 },
]
},
]
});
const app = new Vue({
el: '#box',
data: {},
router,
});
script>
body>
html>
应用场景:通过动态路由参数的模式进行路由匹配。
动态路径参数以冒号":"开头。
路由组件中通过$route.params获取路由参数。
const User = {
//获取路由参数
template: 'User{{$route.params.id}}组件
',
}
const router = new VueRouter({
routes: [
//动态路由参数
{ path: '/user/:id', component: User },
]
});
const User = { //获取路由参数 props:['id'], template: 'User{{id}}组件
',}
const router = new VueRouter({ routes: [ { path: '/user/:id', component: User,props:true}, ]});
const User = { //获取路由参数 props:['uname','age'], template: '用户信息:{{uname + '---' + age}}
',}
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User,props:{uname:'Silly',age:20}},
]
});
const User = {
//获取路由参数
props:['id','uname','age'],
template: '用户信息:{{id + '
---' + uname + '---' + age}}',
}
const router = new VueRouter({
routes: [
{
path: '/user/:id',
component: User,
//函数里面返回一个props对象
props:route=>({
uname:'Silly',
age:20,
id:route.params.id
})
},
]
});
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue的动态路由匹配title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js">script>
head>
<body>
<div id="box">
<router-link to="/user/1">User1router-link>
<router-link to="/user/2">User2router-link>
<router-link to="/user/3">User3router-link>
<router-link to="/register">Registerrouter-link>
<router-view>router-view>
div>
<script>
// 4、定义路由组件
const User = {
//获取路由参数
// props: ['id'],
props: ['id','uname','age'],
template: '组件---用户id:{{id}}---姓名:{{uname}}---年龄{{age}}
',
}
const Register = {
template: 'Register组件
',
}
// 5、配置路由规则并创建路由实例
const router = new VueRouter({
// 路由规则
routes: [
{ path: '/', redirect: '/user' },
//props为布尔类型
/* { path: '/user/:id', component: User, props:true},*/
//props为对象类型
/* {
path: '/user/:id',
component: User,
props:{uname:'Silly',age:20}
}, */
//props为函数类型
{
path: '/user/:id',
component: User,
// 函数体内返回一个props对象
props:route => ({
uname:'Silly',
age:20,
id:route.params.id,
})
},
{ path: '/register', component: Register },
]
})
const app = new Vue({
el: '#box',
data: {},
router,
});
script>
body>
html>
<router-link :to="{name:'user',params:{id:3}}">User3router-link>
const router = new VueRouter({
// 路由规则
routes: [
{ path: '/', redirect: '/user' },
//命名路由
{
name:'user',
path: '/user/:id',
component: User,
props:route => ({
uname:'Silly',
age:20,
id:route.params.id,
})
},
{ path: '/register', component: Register },
]
})
常用的编程式导航API
const User = {
//获取路由参数
props: ['id', 'uname', 'age'],
template: `
组件---用户id:{{id}}---姓名:{{uname}}---年龄{{age}}
`,
methods:{
goRegister(){
//直接跳转到register
this.$router.push('/register');
},
},
}
const Register = {
template: `
Register组件
`,
methods:{
goBack(){
//往后退一步
this.$router.go(-1);
},
},
}
.push()方法
//字符串(路径名称)
router.push('/home')
//对象
router.push({path:'/home'})
//命名的路由(传递参数)
//name命名路由,路由项里面的name值
router.push({name:'/user',params:{userId:1}})
//带查询参数,变成/register?name=Silly
//query值为json对象
router.push({path:'/register',query:{uname:'Silly'}})
.go()方法
router.go({name:'/user',query:{uname:'Silly'}})
.replace()方法
router.replace({name:'/user',query:{uname:'Silly'}})
参数:有 to(去的那个路由)、from(离开的路由)、next(一定要用这个函数才能去到下一个路由,如果不用就拦截)
r o u t e r 为 V u e R o u t e r 实 例 。 想 要 导 航 到 不 同 U R L , 则 使 用 router 为 VueRouter 实例。想要导航到不同 URL,则使用 router为VueRouter实例。想要导航到不同URL,则使用router.push方式,返回上一个
history 也是使用$router.go 方法
$route 从当前 router 跳转对象里面可以获取 name、path、query、params 等。
传递的参数由this. r o u t e . q u e r y 或 者 t h i s . route.query 或 者 this. route.query或者this.route.params 接收