技术标签: router 路由器 Vue 前端 vue.js javascript
路由: 是指从源到目的地时,决定端到端路径的决策过程。 对于VueRouter而言,路由就是根据一个请求路径选中一个组件进行渲染的决策过程。
一个路由(route)就是一组 映射关系(key - value),多个路由需要 路由器(router) 进行管理。
前端路由:key是路径,value是组件
Vue Router :是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
VueRouter包括三个主要组成部分 —— VueRouter、router-view和 router-link
1. 安装vue-router,命令:npm i vue-router
2. 应用插件:Vue.use(VueRouter)
3. 创建路由器实例:编写router配置项
路由器完全依赖于路由表来分发路由请求,因此创建路由器实例时,需要使用 routes配置项 来声明 请求路径(path)和组件(component) 的对应关系 —— 记录这一映射关系的对象,在VueRouter中被称为路由记录(RouteRecord)。 路由器将根据routes路由记录数组来构造路由表。
//引入VueRouter
import VueRouter from 'vue-router'
//引入Luyou 组件
import About from '../components/About'
import Home from '../components/Home'
//创建router实例对象,去管理一组一组的路由规则
const router = new VueRouter({
routes:[
{
path:'/about',
component:About
},
{
path:'/home',
component:Home
}
]
})
//暴露router
export default router
4. 将路由器注入Vue实例
如果在一个Vue实例的模板中需要使用 router-link 和 router-view 组件,需要首先向这个Vue实例注入路由器对象,因为这两个组件都依赖于路由器对象:
在创建Vue实例时,使用router配置项将路由器对象注入Vue实例的$router
属性,例如:
const myrouter = new VueRouter({
...})
const vm = new Vue({
router: myrouter })
5. 声明路由请求接口:
路由链接组件(router-link) 为用户提供了提交路由请求的交互接口。 使用 to属性 来声明链接组件的目标路径。当用户点击链接组件时,组件 向路由器提交向目标路径的路由请求。在模板中,使用 标签声明路由链接元素。
实现切换(active-class可配置高亮样式):
<router-link active-class="active" to="/about">About</router-link>
6. 声明路由出口:
路由视图组件(router-view) 为路由器($router)提供了所选中组件的渲染出口。在模板中,使用标签<router-view>
声明路由视图元素。
<router-view></router-view>
注意点:
pages
文件夹,一般组件通常存放在components
文件夹。$route
属性,里面存储着自己的路由信息。$router
属性获取到。配置路由规则,使用 children配置项:
routes:[
{
path:'/about',
component:About,
},
{
path:'/home',
component:Home,
children:[ //通过children配置子级路由
{
path:'news', //此处一定不要写:/news
component:News
},
{
path:'message',//此处一定不要写:/message
component:Message
}
]
}
]
跳转(要写 完整路径):
<router-link to="/home/news">News</router-link>
作用:可以简化路由的跳转
使用:
给路由命名:
{
path:'/demo',
component:Demo,
children:[
{
path:'test',
component:Test,
children:[
{
name:'hello' //给路由命名
path:'welcome',
component:Hello,
}
]
}
]
}
简化跳转:
<!--简化前,需要写完整的路径 -->
<router-link to="/demo/test/welcome">跳转</router-link>
<!--简化后,直接通过名字跳转 -->
<router-link :to="{name:'hello'}">跳转</router-link>
<!--简化写法配合传递参数 -->
<router-link
:to="{
name:'hello',
query:{
id:666,
title:'你好'
}
}"
>跳转</router-link>
1. 传递参数
<!-- 跳转并携带query参数,to的字符串写法 -->
<router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link>
<!-- 跳转并携带query参数,to的对象写法 -->
<router-link
:to="{
path:'/home/message/detail',
query:{
id:666,
title:'你好'
}
}"
>跳转</router-link>
2. 接收参数:
$route.query.id
$route.query.title
props配置:
作用:让路由组件更方便的收到参数
{
name:'xiangqing',
path:'detail/:id',
component:Detail,
//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
// props:{a:900}
//第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件
// props:true
//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
props(route){
return {
id:route.query.id,
title:route.query.title
}
}
}
1. 配置路由,声明接收params参数
{
path:'/home',
component:Home,
children:[
{
path:'news',
component:News
},
{
component:Message,
children:[
{
name:'xiangqing',
path:'detail/:id/:title', //使用占位符声明接收params参数
component:Detail
}
]
}
]
}
2. 传递参数
<!-- 跳转并携带params参数,to的字符串写法 -->
<router-link :to="/home/message/detail/666/你好">跳转</router-link>
<!-- 跳转并携带params参数,to的对象写法 -->
<router-link
:to="{
name:'xiangqing',
params:{
id:666,
title:'你好'
}
}"
>跳转</router-link>
特别注意:路由携带 params参数 时,若使用 to的对象写法,则不能使用path配置项,必须使用name配置!
3. 接收参数:
$route.params.id
$route.params.title
标签导航<router-link>
,<router-link>
是通过转义为<a></a>
标签进行跳转,其中router-link标签中的to属性会被转义为a标签中的href属性
1、不带参数
<router-link :to="{name:'home'}">
<router-link :to="{path:'/home'}"> //name,path都行, 建议用name
注意:router-link中链接如果是 ‘/’ 开始就是从根路由开始,如果开始不带 ‘/’ ,则从当前路由开始
2、带参数
1)params传参数 (类似post)
<router-link :to="{name:'home', params: {id:1}}">
$route.params.id
this.$route.params.id
2)query传参数 (类似get,url后面会显示参数)
<router-link :to="{name:'home', query: {id:1}}">
$route.query.id
this.$route.query.id
<router-link>
的replace属性:
作用:控制路由跳转时操作浏览器历史记录的模式
浏览器的历史记录有两种写入方式:
push
:追加 历史记录replace
:替换 当前记录路由跳转时候默认为push
方式,开启replace
方式:<router-link replace .......>News</router-link>
作用:不借助<router-link>
实现路由跳转,让路由跳转更加灵活
this.$router 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此属性获取到路由器对象,并调用其push()、go()等方法。
通过this.$router.push()
这个方法来实现编程式导航,也可以实现参数传递,这种编程式导航一般是用于按钮点击之后跳转
1、不带参数
this.$router.push('/home')
this.$router.push({
name:'home'})
this.$router.push({
path:'/home'})
2、带参数
1) query传参 (get请求)
this.$router.push({
name:'home',query: {
id:'1'}})
this.$router.push({
path:'/home',query: {
id:'1'}})
$route.query.id
this.$route.query.id
2)params传参
this.$router.push({
name:'home',params: {
id:'1'}}) // 只能用 name
$route.params.id
this.$route.params.id
其它用法:
this.$router.forward()
this.$router.back()
this.$router.go(n)
作用:对路由进行权限控制
分类:全局守卫、独享守卫、组件内守卫
1、全局守卫:
//全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{
console.log('beforeEach',to,from)
if(to.meta.isAuth){
//判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'xiyou'){
//权限控制的具体规则
next() //放行
}else{
alert('暂无权限查看')
}
}else{
next() //放行
}
})
//全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.meta.title //修改网页的title
}else{
document.title = 'vue_test'
}
})
2、独享守卫:
beforeEnter(to,from,next){
console.log('beforeEnter',to,from)
if(to.meta.isAuth){
//判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'xiyou'){
next()
}else{
alert('暂无权限查看')
}
}else{
next()
}
}
3、组件内守卫:
//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
}
Vue 中,它是通过 mode 这一参数控制路由的实现模式:
const router=new VueRouter({
mode:'history',
routes:[...]
})
mode 参数:
hash模式:
mode:"hash" 多了 “#” --- 默认的
http://localhost:8080/#/login
history模式:
mode:"history"
http://localhost:8080/login
扩展知识:
1、缓存路由组件:
作用:让不展示的路由组件保持挂载,不被销毁。
具体编码:
<keep-alive include="News">
<router-view></router-view>
</keep-alive>
2、两个新的生命周期钩子:
作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
具体分为:
activated
路由组件 被激活 时触发deactivated
路由组件 失活 时触发文章浏览阅读628次,点赞7次,收藏9次。通过贝锐账号和密码登录蒲公英访问端,登录成功后将会为当前设备自动分配一个UID。当多个设备登录同一账号后将自动组网,无需进行组网设置。(只需要把贝锐账号共享给游戏好友登录客户端即可完成组网):打开蒲公英,进入星露谷打开游戏—合作—加入—加入局域网游戏,输入农场主的局域网地址,耐心等待一会,就可以快乐地开始游戏啦!:打开蒲公英,进入星露谷打开游戏—合作—加载,打开联机农场。注意:一定要从“合作”进入,否则是单机模式,好友无法进入。_贝锐蒲公英 星露谷
文章浏览阅读903次。数据同步任务报错:Server returned HTTP response code:401 for url查看easymanager,发现zkfc的2个节点挂掉,使用滚动重启后恢复健康状态,但是再次执行任务还是报错。分析发现是从服务器拉取日志报错,实际后台任务已经执行完成,数据量也能对上。错误1:Could not establish connection to jdbc:hive...Read time out 或者 后台接口调用异常,状态码:402,说明信息:无法调用接口问题排._has failed the maximum allowable number of times
文章浏览阅读123次。本节书摘来自异步社区《编程珠玑(第2版•修订版)》一书中的附录A 算法分类,作者【美】Jon Bentley,更多章节内容可以访问云栖社区“异步社区”公众号查看。附录A 算法分类编程珠玑(第2版•修订版)本书涵盖了大学算法课中的许多内容,但侧重点不同——我们更强调应用和编码,而不强调数学分析。本附录将有关内容组织成更标准的提纲形式。A.1 排序问题定..._编程珠玑(第2版 修订版)
文章浏览阅读525次。安装VMware和安装linux_vmware9安装教程
文章浏览阅读1.4k次。保存了SVM的模型,其实本来最开始保存的是.gz格式,然后换成了.h5。从上面这个链接得知大概就是因为h5文件并不是完整的。然后就又改成了保存.gz格式,用load导入模型。_oserror: unable to open file (file signature not found)
文章浏览阅读4.3k次,点赞13次,收藏24次。一、前言收到一个高兴的消息: 2018 年 Github 最新统计出炉, Godot 是所有项目里增长速度最快的第三位!所以,我还是非常看好它的,哈哈!链接在此: Fastest growing open source projects ,截图如下:吹逼结束,本着承上启下的精神,本篇一起来学习并打造一个“美丽壮观”的游戏世界。使用的工具是 Godot 中的 TileMap 瓦片..._godot3 tilemap
文章浏览阅读543次。收藏公众号CyC2018每日一更,都是面试常见问题 大家可以自行关注微信公众号 CyC2018 作者很棒03-06 非递归实现树的前中后序遍历_基础知识cyc2018
文章浏览阅读1.6k次。ffmpeg avcodec_send_packet 返回值 -1094995529 错误信息 Invalid data found when processing input
文章浏览阅读1.5k次,点赞46次,收藏37次。2023年终总结
文章浏览阅读1.5k次。使用以下配置方法不需要配置chroot。编辑sshd_config文件vi /etc/ssh/sshd_config增加:Subsystem sftp /usr/libexec/openssh/sftp-server -l VERBOSE然后重启sshdservice sshd restart对应的sftp命令会被记录在/var/log/messages如果不想记录到messages文件..._subsystem sftp /usr/libexec/openssh/sftp-server -l info -f auth
文章浏览阅读3.9k次。我们说一说目前的门禁卡到底有哪些类型呢?门禁卡一般分为:ID卡和IC卡。而EM卡、M1卡、CPU卡等等,都是这两种卡的细分。它们能够开门,都是基于RFID感应的原理来实现开门的。我们看一张图,在这张图中,能够看到一个数据名词,频率:ID卡的工作频率为125KHz频率,而IC卡的工作频率为13.56MHz,显然因为IC卡的频率高,所以,它的安全性比较高。小区基本上选择IC卡的概率会更高一..._wcopynfcpro教程
文章浏览阅读1.2k次。当智能手机走向巅峰状态,不仅仅体现在对于社会经济的颠覆性改变,更是让我们发现原来某个智能产品居然有如此神奇而巨大的威力!那么物联网时代,类智能手机这样的智能硬件将越来越多,哪一项会带来更加颠覆的效果呢?目前我们一致认为智能汽车会是这样的产品!不妨研究下当前车联网发展的真实状况如何?车联网将汽车组成数据互动网络,通过搭设大量的传感器和先进的通信技术,对包括车辆、公路、人、环境等..._车联网使汽车成为下一代移动智能终端