1.路由的基本概念与原理
路由 是一个比较广义和抽象的概念,路由的本质就是对应关系
在开发中,路由分为
1.1 后端路由
概念:根据不同的用户URL请求,返回不同的内容
本质:URL请求地址与服务器资源之间的对应关系
2.
SPA (SIngles Page Application )
(1)后端渲染(存在性能问题,整页的刷新等)
(2)Ajax前端渲染(前端渲染提高性能,可以局部刷新,但是不支持浏览器前进后退操作,浏览器无法保存用户在浏览器的状态)
(3)SPA(Single Page Application)单页面应用程序:整个网站只有一个页面,内容的变化通过Ajax局部刷新实现,同时支持浏览器地址栏前进和后退操作
(4)SPA实现原理之一:基于URL地址的hash(hash的变化会导致浏览器记录访问历史的变化,但是hash的变化不会触发新的URL请求)
(5)在实现SPA过程中,最核心的技术点就是前端路由
1.2.前端路由
概念:根据不同的用户事件,显示不同的页面内容
本质:用户事件与事件处理函数之间的对应关系
2.路由的基本使用
Vue Router是vue官方提供的路由管理器,它和vue.js的核心深度集成,可以非常方便的用于SPA应用程序的开发
2.1vue Router 包含的功能有
1.支持HTML5历史模型或hash模式
2.支持嵌套路由
3.支持路由参数
4.支持编程式路由
5.支持命名路由
2.2vue Router 的基本使用步骤
1.引用相关的库文件
2.添加路由链接
3.添加路由填充位
4.定义路由组件
5.配置路由规则并创建路由实例‘
6.把路由挂载到Vue根实例中’
一、引入相关的库文件
vue文件一定要在最上面
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router/dist/vue-router.js"></script>
二、添加路由链接
router-link是vue中提供的标签,默认会被渲染为a标签
to属性默认会被渲染为href属性
to属性的值默认会被渲染为#开头的hash地址
<router-link to="/user">User</router-link>
<router-link to="/register">Register</router-link>
三、路由填充位
路由填充位也叫路由占位符,将通过路由规则匹配到的组件,将会被渲染到router-view所在的位置
<router-view></router-view>
四、定义路由组件
const User = {
template: '<h1>User组件</h1>'
}
const Register = {
template: '<h1>Register</h1>'
}
五、配置路由规则并创建路由实例
最起码要包含path 和 component
//创建路由实例对象
const router = new VueRouter({
//所有的路由规则
routes: [
{
path: '/user',
component: User
},
{
path: '/register',
component: Register
}
]
})
六、把路由挂载到Vue根实例中
由图可见 变成了标签
2.3 路由重定向
路由重定向指的是:用户在访问地址A的时候,强制用户跳转到地址c,从而展示特定的组件页面,通过路由规则的redirect属性,指定一个新的路由地址,可以方便的设置路由重定向
应用:
当你访问根路径的时候,让他直接打开到user页面
{
path: '/',
redirect: '/user'
},
3.vue-router嵌套路由
3.1嵌套路由用法
3.1.1 嵌套路由功能
(1)点击父级路由链接显示模板内容
(2)模板内容中又有子路由链接
(3)点击子级路由链接显示子级模板内容
3.1.2 父路由组件模板
父级路由链接
父级路由填充
<router-link to="/user">User</router-link>
<router-link to="/register">Register</router-link>
<!-- 路由占位符 -->
<router-view></router-view>
3.1.3子组件路由模板
子级路由链接
子级路由填充位
const Register = {
template: `<div>
<h1>Register组件1</h1>
<hr />
<!--子路由链接-->
<router-link to="/register/tab1">tab1</router-link>
<router-link to="/register/tab2">tab2</router-link>
<!--子路由占位符-->
<router-view />
</div>`
}
创建子组件
const Tab1 = {
template: '<h3>tab1子组件</h3>'
}
const Tab2 = {
template: '<h3>tab2子组件</h3>'
}
3.1.4嵌套路由规则
父级路由通过children属性配置子级路由
{
path: '/register',
component: Register,
children: [
{
path: '/register/tab1',
component: Tab1
},
{
path: '/register/tab2',
component: Tab2
}
]
}
效果图
vue-router动态路由匹配
4.1 动态匹配路由的基本用法
应用场景:通过动态路由参数的模式进行路由匹配
代码实现
先在template中修改
<div id="app">
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link to="/user/3">User3</router-link>
<router-link to="/register">Register</router-link>
<!-- 路由占位符 -->
<router-view></router-view>
</div>
再到路由里面去修改
{
path: '/user/:id',
//和to里面的一样
component: User
},
最后到修改子组件
const User = {
template: '<h1>User组件 --用户的id{{$route.params.id}}</h1>'
}
4.2路由组件传递参数
4.2.1 使用$route进行接收值
第一步在router中进行相应路由规则的编写
{
path: '/user/:id',
//和to里面的一样
component: User
},
在子组件进行相应的接收
const User = {
template: '<h1>User组件 --用户的id{{$route.params.id}}</h1>'
}
结果:
$route与对应路由形成高度耦合,不够灵活,所以可以适应props将组件和路由解耦
4.2.2 props的值为布尔类型
第一步在router里面的user路由规则设置props:true
{
path: '/user/:id',
//和to里面的一样
component: User,
props: true
},
第二步咋到相应子组件中设置接收props
const User = {
props: ['id'],
template: '<h1>User组件 --用户的id:{{id}}</h1>'
}
4.2.3 props的值为对象类型
第一步现在router中对相应的路由规则设置
{
path: '/user/:id',
//和to里面的一样
component: User,
props: {
uname: 'lisi',
age: 12
}
},
再到相应子组件中接收
const User = {
props: ['uname','age'],
template: '<h1>User组件 --用户的名字{{uname}}和年龄{{age}}</h1>'
}
4.2.4 props的值为函数类型
第一步是router中找到相应的路由规则进行编写
{
path: '/user/:id',
//和to里面的一样
component: User,
props: route => ({
uname: 'Alan',
age: 23,
id: route.params.id
})
},
第二步到相应子组件中接收值
const User = {
props: ['id','uname','age'],
template: '<h1>User组件 --用户的id{{id}}和名字{{uname}}和年龄{{age}}</h1>'
}
5.vue-router命名路由
5.1 命名路由的配置规则
为了更好方便的表示路由的路径,可以给路由规则起一个别名,即为命名路由
就是上面name:‘user’就是它的命名路由
在router中的相应的路由规则中设置name
{
path: '/user/:id',
//和to里面的一样
component: User,
name: 'user',
props: route => ({
uname: 'Alan',
age: 23,
id: route.params.id
})
},
在template中router-link 中将to改为:to
<div id="app">
<router-link to="/user/1">User1</router-link>
<router-link to="/user/2">User2</router-link>
<router-link :to="{name: 'user',params:{id:3}}">User3</router-link>
<router-link to="/register">Register</router-link>
<!-- 路由占位符 -->
<router-view></router-view>
</div>
6.vue-router编程式导航
6.1 页面导航的两种方式
声明式导航:通过点击链接实现导航方式,叫声明式导航
例如:普通网页中的链接或者vue中的
编程式导航:通过调用javascript形式的API实现导航的方式,叫做编程式导航
例如:普通网页中的location.href
6.1.1 编程式导航基本用法
常用的编程序导航API如下
this.
r
o
u
t
e
r
.
p
u
s
h
(
′
h
a
s
h
地
址
′
)
t
h
i
s
.
router.push('hash地址') this.
router.push(′hash地址′)this.router.go(n)
this.$router.push()的调用
const User = {
props: ['id','uname','age'],
template: `<div>
<h1>User组件 --用户的id{{id}}和名字{{uname}}和年龄{{age}}</h1>
<button @click="goRegister">跳转到注册页面</button>
</div>`,
methods: {
goRegister() {
this.$router.push('/register')
}
},
}
this.$router.go()使用
const Register = {
template: `<div>
<h1>Register组件</h1>
<button @click="goBack">后退</button>
</div>`,
methods: {
goBack() {
this.$router.go(-1)
}
}
}
router.push()方法参数规则