vue-router
是vue官方的一个插件 和vuex类似
专门用来实现一个SPA应用
基于vue的项目基本都会用到此库
vuex vue-router 这两个插件应用比较广泛
整个应用只有一个完整的页面(这个完整的页面,由多个组件组成)
点击页面中的链接不会刷新页面, 本身也不会向服务器发普通请求
当点击路由链接时,路径改变, 最终只会做页面的局部更新(组件切换)
切换过来之后,数据都需要通过ajax请求获取, 并在前端异步展现
路由器:管理路由使用的工具,路由器一个项目当中只能有一个
路由:是一个key:value的映射关系
前台路由 路径 和 组件
{path:'/home',
component:Home}
当点击链接的时候,路径会发生变化,但是不会向服务器发普通请求,而是去显示对应的组件
后台路由 路径 和 函数
app.get('/users/info',function(req,res){
})
当点击链接(a标签)的时候,路径会发生变化,而且会向服务器发请求,
然后匹配到后端的一个函数处理这个路由的请求,返回需要的数据
4、简单理解前台路由:路由可以让我们实现组件的切换和跳转:
点击链接,改变路径
匹配路由,
显示对应的组件
组件: 代码和资源的集合就叫组件
非路由组件:
不需要路径的改变去切换
定义:定义组件都是创建一个.vue文件,只是定义的位置不同,它是在components里面
注册:在哪用在哪引入去注册,或者全局注册
使用:在哪用在哪写组件标签,本质是内存中多了个组件对象
路由组件:
需要路径的改变才能切换
定义:定义组件都是创建一个.vue文件,只是定义的位置不同,它是在pages(views)里面
注册:在路由器当中配置路由的时候注册
使用:在固定的内置组件当中进行切换
路由组件和非路由组件的最大区别
除了在注册和使用的时候这两种组件有区别,其实他们的生命周期也是有很大区别的
路由组件的生命周期是点击链接的时候,才开始的,路由组件才会创建,mounted才能执行
路由组件在切换的时候,会被销毁,显示的时候重新创建
同一个路由组件传参显示不同数据,mounted回调只会执行一次,因为是同一个组件
1)、拆分页面定义组件
路由组件和非路由组件2)、路由器注册路由组件(注册组件):
路由器的配置
1、安装路由器 vue2安装的是3版本
2、引入并声明使用
3、向外暴露一个路由器对象
4、在main.js当中注入路由器对象
在每个vue的组件当中都可以通过this.$router拿到路由器对象
this.$route拿到当前匹配到的路由对象配置完路由器,你就可以配置路由,同时就注册了路由组件了
3)、使用路由实现组件切换
router-link 路由链接,就是点哪,可以让你的路径变为你指定的router-view 路由组件显示区域,就是组件需要在哪显示
路由传参
第一步:把参数写在路由链接路径当中,用户点击会修改路径 (字符串和对象)
路由传参的两种参数:params参数 query参数
我要传递id使用params参数 params参数是属于路径的一部分,配置路由的时候就要占位
我要传递content使用query参数 query参数是?分割后面的key=value&key=value,但是不属于路径的一分部
path:'msgdetail/:msgId', //:msgId是给传递的params参数占位,
第二步:点击路由链接的时候,路径会去路由器当中的路由当中匹配,匹配同时会把参数解析添加到路由对象当中
第一种写法:字符串拼接
第二种写法:模板字符串
第三种写法:对象
params:{msgId:m.id},
query:{msgContent:m.content}
}">{{m.content}}
第三步:匹配成功,显示对应的路由组件同时把当前的路由对象让所有的组件(路由和非路由组件)都可以得到
标签接收时{{$route.params.msgId}}
Props传参
通过props配置简化路由传递参数的操作
1、props:布尔值,只能映射params参数,不用
props:true //它是把params参数映射为组件内的属性
2、props:对象,专门用来映射一些额外的数据,也很少用
props:{username:'赵丽颖'}
3、props:函数
props(route){
return {msgId:route.params.msgId,msgContent:route.query.msgContent}
}
Props布尔值
在路由里写props: true 它是把params参数映射为组件内的属性
组件中 props:['msgId']接收,在标签可直接写 {{msgId}}
Props对象
props: {username: '哈哈'}
组件接收并使用
props: ['msgId','username'],
Props函数
props(route){
return {
msgId: route.params.msgId,
msgContent: route.query.msgContent,
}
编程式导航和声明式导航
前面我们都是借助router-link 自动生成的跳转方式去跳转的,叫做声明式导航
编程式导航,用于点击之后自己调用进行导航跳转
push是有历史记录,后期我们返回的时候,是可以选择返回的历史记录界面
replace是不保存历史记录,后期返回的时候,不能去到历史记录界面
this.$router.push()
this.$router.replace()
路由跳转书写路径的方式和声明式导航一致
{
name: 'newsdetail', //导航跳转时的识别标识
path: 'newsDetail/:newsId',
component: NewsDetail
}
2. 点击路由链接的时候,路径会去路由器当中的路由当中匹配,匹配同时会把参数解析添加到路由对象当中
在页面标签中绑定事件,遍历需要传参
@click="toDetail(n)"
methods中写函数调用
toDetail(n){
this.$router.replace({
name: 'newsdetail',
params: {newsId: n.id},
query: {newsContent: n.content}
})
}
3. 匹配成功,显示对应的路由组件同时把当前的路由对象让所有的组件(路由和非路由组件)都可以得到
声明式和编程式的区别
声明式简洁,不需要我们自己手写逻辑,直接就能跳转,我们不能加入自己的逻辑
编程式导航,需要自己手写逻辑,才能跳转,我们可以加入自己的逻辑
某些特定的场合下:编程式导航比声明式导航效率要高
编程式导航的使用
1) this.$router.push(path): 相当于点击路由链接(可以返回到当前路由界面)
2) this.$router.replace(path): 用新路由替换当前路由(不可以返回到当前路由界面)
3) this.$router.back(): 请求(返回)上一个记录路由
4) this.$router.go(-1): 请求(返回)上一个记录路由
5) this.$router.go(1): 请求下一个记录路由
$router.push()和$router.replace()的区别,返回有区别。
$router.push()是往历史记录里面追加
$router.replace()每一次都是覆盖添加
缓存路由组件
使用的是vue的一个内置组件,参考vue的官方文档
使用这个东西可以保证我们在切换组件的时候,原来显示的组件不被销毁
hash模式:
路径中带#: http://localhost:8080/#/home/news
发请求的路径: http://localhost:8080/ 项目根路径
响应: 返回的总是index页面 ==> path部分(/home/news)被解析为前台路由路径
#是区分后台路径和前台路由路径的标志
history模式:
路径中不带#: http://localhost:8080/home/news
发请求的路径: http://localhost:8080/home/news
响应: 404错误
希望: 如果没有对应的资源, 返回index页面, path部分(/home/news)被解析为前台路由路径
解决: 添加配置
devServer添加: historyApiFallback: true, // 任意的 404 响应都被替代为 index.html
output添加: publicPath: '/', // 引入打包的文件时路径以/开头