vue-router详尽:编程式导航、路由重定向、动态路由匹配、路由别名、嵌套路由、命名视图

vue-router编程式导航

 

在vue项目中经常用到this.$router.push() 和 this.$router.replace() 方法进行路由跳转就是编程式导航。。。

通俗理解编程式导航:通过操作$router实例的JavaScript代码实现路由跳转。点击 <router-link :to="..."> 等同于调用 router.push(...)。$router实例的方法有push()、replace()、go()方法,也可以进行路由传参。

先上代码简单入手看效果:

 

demo基于vue-cli创建的,项目结构如图:

第一步:定义路由文件 router >index.js如下

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'import home from '@/components/Home'   //引入组件Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: HelloWorld},{path: '/home',       //可以定义路由路径、命名、组件、参数、别名、重定向name: 'home',component: home}, ]
})

第二步:helloWorld页面使用声明式和编程式导航到home组件的按钮,helloWorld组件如下

<template><div class="hello"><h1>{{ msg }} 页面</h1><router-link to="/home">声明式使用router-link路由导航到home页面</router-link><br><button @click="pushToHome()">js编程式push方法导航到home页面</button><button @click="replaceToHome()">js编程式replace方法导航到home页面</button><br><button @click="goNext()">js编程式go方法导航到history记录的下一个页面</button><router-view></router-view></div>
</template><script>
export default {name: 'HelloWorld',data () {return {msg: 'Welcome to HelloWorld' }},methods:{pushToHome:function(){this.$router.push("/home",function(){   //push()方法的使用,包括导航成功或失败的回调函数console.log("导航成功的回调函数");},function(){console.log("导航中止的回调函数");}); },replaceToHome:function(){               //replace()方法的使用this.$router.replace("/home"); },goNext:function(){                  //go()方法的使用this.$router.go(1); }}
}
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
button {margin:10px;
}
</style>

第三步骤页面:home组件中可以使用router.go(-1) 返回到上一个历史记录中的页面;无记录时点击无效。home组件如下

<template><div class="hello"><h1>{{ msg }}</h1><button @click="goBack()">js编程式go方法返回history页面</button></div>
</template><script>
export default {name: 'Home',data () {return {msg: 'Welcome to Home 主页!!!!' }},methods:{goBack:function(){this.$router.go(-1);   }}
}
</script><style scoped>
h1, h2 {color:red;
}
</style>

 

router.push(location, onComplete, onAbort)方法

1、router.push() 方法,参数分别指的是导航到 新的url、导肮完成的回调函数、导航中止的回调函数 

2、router.push() 方法 会向history栈添加一个新的记录 ,所以当用户点击浏览器后退按钮时,则回到之前的 URL。

3、router.push(location)方法使用

//使用路由的path值
this.$router.push("/router1");//使用包含路由path键值的对象
this.$router.push({path:'/router1'});//使用包含路由name键值的对象
this.$router.push({name:'routerNum1'});//使用包含name键值和params参数对象的对象,
//注意:该方式params传参浏览器页面不在url中显示参数,但是会页面刷新的时候丢失参数
this.$router.push({name:'routerNum1',params:{userId:123}}); //path键值结合params的形式传参无效
this.$router.push({path:'/router1',params:{userId:123}});//可以使用path键值结合query的形式传参
this.$router.push({path:'/router1',query:{userId:123}});//使用path值拼接参数来传参,注意这里使用的不是单引号!!!
const userId=123;
this.$router.push({path:`/router1/${userId}`}); 

 4、 push()编程式导航注意点:

const userId = 1231、router.push({ path: `/router1/${userId}` }) // 注意使用反引号2、router.push({ path: '/router1', params: { userId }}) // 注意path键值结合params传参无效3、router.push({ name: '/routerNum1', params: { userId }}) // 注意该方式在浏览器url不显示参数,但是页面刷新会导致参数丢失

 

4、小demo使用验证如下:

第一步:定义路由文件 router >index.js如下

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'import home from '@/components/Home'
import router1 from '@/components/Router1'
import router2 from '@/components/Router2'Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: HelloWorld},{path: '/home',  name: 'home',component: home},{path: '/router1',name: 'routerNum1',component: router1},{path: '/router2',name: 'routerNum2',component: router2},    ]
})

第二步:home.vue组件文件代码如下。

<template><div class="hello"><h3>{{ msg }}</h3><button @click="goBack()">js编程式go方法返回history页面</button><hr><h3>js编程式导航中push方法的使用:</h3><button @click="pathTo()">push方法的url参数使用path值导航</button><button @click="pathObjectTo()">push方法的url参数使用path对象导航</button><br><button @click="nameObjectTo()">push方法,包含路由命名name键值的对象导航</button><br><button @click="nameParamTo()">push方法,包含路由命名name键值的对象结合params传参</button><br><button @click="pathParamTo()">push方法,path键值对象导航结合params传参,参数传递失败</button><button @click="pathQueryTo()">push方法,path键值对象导航结合query传参</button><br><button @click="pathandTo()">push方法,path值拼接参数来传参</button></div>
</template><script>
export default {name: 'Home',data () {return {msg: 'Welcome to Home 主页!!!!' }},methods:{goBack:function(){this.$router.go(-1);   },pathTo:function(){     //使用路由的path值this.$router.push("/router1");},pathObjectTo:function(){   //使用包含路由path键值的对象this.$router.push({path:'/router1'});},nameObjectTo:function(){  //使用包含路由name键值的对象this.$router.push({name:'routerNum1'});},nameParamTo:function(){  //使用包含name键值和params参数对象的对象this.$router.push({name:'routerNum1',params:{userId:123}}); },pathParamTo:function(){  //path键值结合params的形式传参无效this.$router.push({path:'/router1',params:{userId:123}}); },pathQueryTo:function(){  //可以使用path键值结合query的形式传参this.$router.push({path:'/router1',query:{userId:123}}); },pathandTo:function(){const userId=123;this.$router.push({path:`/router1/${userId}`});  }}
}
</script><style scoped>
h1, h2 {color:red;
}
</style>

第三步:router1.vue组件代码如下,使用this.$route.params.paramName或query.queryName接收路由传的参数

<template><div class="hello"><h3>{{ msg }}</h3><button @click="goBack()">js编程式go方法上一个路由页面</button><p>{{fromRouterParams}}</p><p>{{fromRouterQuery}}</p></div>
</template><script>
export default {name: 'Router1',data () {return {msg: 'Welcome to Router1' ,fromRouterParams:this.$route.params.userId,fromRouterQuery:this.$route.query.userId,}},methods:{goBack:function(){this.$router.go(-1);        },}
}
</script><style scoped>
h1, h2 {color:red;
}
</style>


router.replace(location, onComplete, onAbort)方法

跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录;

 

router.go(n)方法

1、参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。 Browser History APIs点击了解更多

2、使用:

// 在浏览器记录中前进一步,等同于 history.forward()
router.go(1)// 后退一步记录,等同于 history.back()
router.go(-1)// 前进 3 步记录
router.go(3)// 如果 history 记录不够用,那就默默地失败呗
router.go(-100)
router.go(100)

Vue Router 的导航方法 (push、 replace、 go) 在各类路由模式 (history、 hash 和 abstract) 下表现一致。

 

路由重定向:

路由配置{ path: '/a', redirect: '/b' },路由重定向是指当用户访问 /a时,路由跳转到b路由,URL 将会被替换成 /b

1、在路由配置文件 router >index.js上使用:

const router = new VueRouter({routes: [{ path: '/router1', redirect: '/router2' },  //是从 /route1 重定向到 /router2{ path: '/b', redirect: {name:'foo'} },  //重定向的目标也可以是一个命名的路由{ path: '/c', redirect:(to)=>{// 方法接收 目标路由 作为参数// return 重定向的 字符串路径/路径对象//注意:导航守卫应用在导航跳转目标to上}},]
})

2、注意在给路由设置有路由重定向时,再使用的路由导航会应用在跳转to指向的路由上,如下路由router1上的导航守卫无效

    {path: '/router1',redirect: '/router2',name: 'routerNum1',component: router1,beforeEnter:(from,to,next)=>{       //导航守卫无效console.log("在路由1上进行重定向");   next();}},{path: '/router2',name: 'routerNum2',component: router2,beforeEnter:(from,to,next)=>{console.log("进入到了路由2");next();}},    

3、重定向指向自身会报错[Vue warn]: Error in beforeCreate hook: "RangeError: Maximum call stack size exceeded,使用动态路径参数传参除外

 

路由别名

路由别名可以理解为路由的 '小名',可以使用路由别名进行路由导航

路由 /router2 的别名 alias 为 /secondRouter ,那么使用别名访问 /secondRouter 时,url是/secondRouter,导航跳转到路由 /router2 ,如下

    {path: '/router2', name: 'routerNum2', alias:'/secondRouter',component: router2 },

 

动态路由匹配:

使用情况:

1、如果导航目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个 /users/1 -> /users/2),需要组件复用,组件复用意味着组件的生命周期钩子函数不会被调用

2、或者所有路由映射到同一个组件模式渲染,只是参数不同时。那么,我们可以在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) 来达到这个效果:

动态路径参数的使用

第一步:动态路径参数的使用需要在路由配置文件上使用冒号开头的形式

    {//动态路径参数的使用 冒号开头//那么像/router1/1 和/router1/2都将跳转到该路由页面path: '/router1/:userNum',   name: 'routerNum1',component: router1,},

第二步:使用this.$router.push({path:  `/router1/${userNum1}` }); 形式进行动态路径传参,注意反引号,url中的参数不会刷新丢失

<template><div class="hello"><h3>{{ msg }}</h3><button @click="goBack()">js编程式go方法返回history页面</button><hr><h3>js动态路由匹配的使用:</h3><button @click="pathParam1To()">动态路径参数1导航</button><button @click="pathParam2To()">动态路径参数2导航</button><hr><button @click="diffParamsTo()">导航到当前组件(组件复用),但传递的参数不同</button></div>
</template><script>
export default {name: 'Home',data () {return {msg: 'Welcome to Home 主页!!!!' }},watch: {'$route' (to, from) {// 对路由变化作出响应...console.log('路由发生变化');console.log(this.$route.params.userNum);}},methods:{goBack:function(){this.$router.go(-1);   },pathParam1To:function(){let userNum1=111111;this.$router.push({path:`/router1/${userNum1}`}); },pathParam2To:function(){let userNum2=222222;this.$router.push({path:`/router1/${userNum2}`}); },diffParamsTo:function(){let userNum2=666;this.$router.push({path:`/router1/${userNum2}`}); },}
}
</script><style scoped>
h1, h2 {color:red;
}
</style>

第三步:可以在路由组件中使用this.$route.params获取动态路径参数,如下

<p>{{this.$route.params.userNum}}</p>

 

组件复用

复用组件时,想对路由参数的变化作出响应的话,你可以简单地 watch (监测变化) $route 对象:

  watch: {'$route' (to, from) {// 对路由变化作出响应...console.log('路由发生变化');console.log(this.$route.params.userNum);}},

也可以使用2.2中引入的 beforeRouteUpdate导航守卫来响应这个变化 (比如抓取用户信息)。组件内导航守卫可以点击了解

const User = {template: '...',beforeRouteUpdate (to, from, next) {// react to route changes...// don't forget to call next()}
}

 

嵌套路由

 嵌套路由指的是在渲染的路由组件页面中包含了下级路由渲染出口(<router-view>),浏览器的URL 中各段动态路径也按某种结构对应嵌套的各层组件,

在项目的app.vue 文件中<router-view>是最顶层的出口,渲染最高级路由匹配到的组件。

<div id="app"><router-view></router-view>
</div>

第一步:定义路由配置文件router >index.js,在路由上使用children属性定义下级路由

import Vue from 'vue'
import Router from 'vue-router'
import helloWorld from '@/components/HelloWorld'
import home from '@/components/Home'
import book from '@/components/Book'
import water from '@/components/Water'Vue.use(Router)
export default new Router({routes: [{path: '/',component:helloWorld},{path: '/home',component: home,children:[{path:'',     //当访问的子路由路径无匹配时会指向到该空的子路由component:water,},{path:'book',component:book,},{path:'water',component:water,},]},]
})

第二步:路由组件home.vue的内容,子路由导航包括了声明式和编程式导航

<template><div class="hello"><h3>{{msg}}</h3><button @click="showBookRouter()">点击按钮显示子路由页面book</button><button @click="showWaterRouter()">点击按钮显示子路由页面water</button><br><router-link to="/home/book">book</router-link><router-link to="/home/water">water</router-link><router-link to="/home/">foo</router-link><router-view></router-view></div>
</template><script>
export default {name: 'Home',data () {return {msg: 'Welcome to Home !!!'}},methods:{showBookRouter:function(){this.$router.push('/home/book');  //编程式路由导航},showWaterRouter:function(){this.$router.push('/home/water');},}
}
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {color:red;
}
</style>

第三步:子组件book.vue 和water.book这里就不写了

 

命名视图

同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default

<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>

一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 components配置 (带上 s):

    {path: '/',components: {default: water,a: book,b: water}}

 

参考网址:官网API https://router.vuejs.org/zh/guide/essentials/navigation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础学习笔记(一)

java开发环境搭建&#xff1a;JDK配置 java 集成开发环境IDE&#xff08;Integrated Development Environment&#xff09; 》Eclipse工具 1、官网下载后安装elipse&#xff0c;注意&#xff1a;Eclipse 安装时JDK位数和Eclpise位数必须保持一致&#xff0c;安装过程中Switch…

常用矢量图有哪些格式?AI文件存储为psd分层

前言 下载的矢量图资源会发现有ai格式、cdr格式的、eps格式、icon格式&#xff0c;有的能使用Photoshop打开而有的不行。使用Photoshop保存矢量图时候选择什么格式保存都是经常遇到的问题。 常见问题及解决&#xff1a;PS打开ai格式的矢量图文件&#xff0c;你用PS打开发现只…

java基础学习笔记(二)

1、数组排序之选择法排序和冒泡排序&#xff1f; 选择法排序原理&#xff1a;数组第一位和后续位置数值比较&#xff0c;最大或最小的调换位置后放在第一位&#xff1b;依次比较将第二大或小的值调换位置后放在第二位置&#xff1b;代码如下&#xff1a; for (int j 0; j <…

java基础学习笔记(三)

1、装箱和拆箱 所有基本类型都有对应的类类型&#xff0c;比如int对应的类是Integer,这种类就叫做封装类。数字封装类有Byte、Short、Integer、Long、Float、Double这些类都是抽象类Number的子类。封装类和基本类型之间可以相互转换&#xff0c;而基本类型自动转封装类型就叫装…

名片设计尺寸及注意事项(详尽),附加:文字转曲线或外框字;网址、文字转二维码方法

附加&#xff1a; 文字如何转曲线或外框字&#xff1f;&#xff1f; "转曲"是在用Corl Draw(简称CD)或者Adobe Illustrator(简称AI)做图时对文字作的一项重要操作,因为如果不转曲的话在把文件拿到其它电脑上编辑时可能会因为缺少字体文件而不能正常显示文字!! 转曲…

AVI转MP4视频无损格式转码

前言&#xff1a;产品宣传需要无损avi转mp4转换格式 前期准备&#xff1a; 格式工厂 下载链接&#xff1a;https://pan.baidu.com/s/1WLD1ip9EaMdca_k2x7Zhvg 提取码&#xff1a;i4nx DIVX、AVC、HEVC三种压码格式的区别&#xff1a; DivX是早期的MPEG4视频压缩编码&…

vue-cli搭建和“Cannot find module npm-cli.js” 、“operation not permitted” 、 deprecated coffee-script等错误

前言&#xff1a;重装nodejs后&#xff0c; vue-cli搭建项目后运行vue项目报错报错 "npm Error: Cannot find module npm-cli.js" &#xff0c;同时发现npm -v 也报错。 分析: vue-cli脚手架模板是基于node下的npm来完成安装的&#xff0c;安装vue-cli也会先安装no…

websocket 学习--简单使用,nodejs搭建websocket服务器,到模拟股票,到实现聊天室

websocket简介&#xff1a; WebSocket协议是 HTML5 开始提供的一种基于TCP的一种新的全双工通讯的网络通讯协议。它允许服务器主动发送信息给客户端。 和http协议的不同&#xff1f;&#xff1f; HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型…

红队打靶练习:DIGITALWORLD.LOCAL: FALL

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 6、小结 目录探测 1、gobuster 2、dirsearch WEB 80端口 /test.php 文件包含漏洞 SSH登录 提权 get root and flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interfa…

vue全局安装jquery,vue使用bootstrap框架,vue中封装websocket通讯,vue引入element-ui 组件库,引入highcharts图表插件

vue安装jquery&#xff1a; 1、使用vue-cli创建好vue项目后&#xff0c;在项目文件夹下&#xff0c;使用命令npm install jquery --save-dev 引入jquery。 2、修改项目文件 build/webpack.base.conf.js&#xff0c;添加如下内容&#xff1a; var webpackrequire(webpack) mo…

flex弹性布局笔记

学习自菜鸟教程的flex布局笔记 布局的传统解决方案&#xff0c;基于盒装模型&#xff0c;依赖 display 属性 position 属性 float 属性。它对于那些特殊布局非常不方便&#xff0c;比如&#xff0c;垂直居中就不容易实现。 简介&#xff1a; W3C提出了一种新的方案—-Flex布…

css宽高自适应布局,实现Sticky Footer的三种布局方式

宽度自适应布局&#xff1a; 1、使用场景&#xff1a; 一侧&#xff08;左侧或者右侧&#xff09;为固定的导航或者菜单栏&#xff0c;另一侧将会随着浏览器的缩放而自适应改变其大小。这种布局结构可用于顶层布局结构亦可用于某个局部功能块&#xff0c;常见于各种web系统&am…

vue学习:事件传递(冒泡和捕获),事件委托,jquery中的事件委托,$event 获取元素,vue事件修饰符

事件传递 ----冒泡和捕获 DOM事件标准定义了两种事件流&#xff0c;这两种事件流分别是捕获和冒泡。 和许多Web技 术一样&#xff0c;在它们成为标准之前&#xff0c;Netscape和微软各自不同地实现了它们。Netscape选择实现了捕获事件流&#xff0c;微软则实现了冒泡事件流。…

vue中路径的配置使用

绝对路径使用&#xff1a; 在项目中build文件夹下的webpack.base.conf.js的 使用如下&#xff1a; import mock from /mock/mock.js; html 相对路径使用 1. 当需要引用 同一目录下的文件&#xff0c;直接输入文档, 如下 <img src”bg.jpg” /> 2、当需要引用下一级目录…

常用MIME类型,解决IIS布署后字体文件、mp4视频文件等not found 的错误

前言&#xff1a;项目在本地运行正常&#xff0c;但部署在IIS服务器后使用浏览器访问项目会报&#xff1a;404 not found 错误&#xff0c;包括mp4视频文件和woff文件找不到。。如下 原因&#xff1a;在IIS中没有将 .mp4和 .woff 后缀的相应的MIME类型&#xff0c;使得 .mp4等格…

浏览器兼容video视频播放的多种方法

前言&#xff1a; 在 HTML 中播放视频并不容易&#xff01;因为直到现在&#xff0c;仍然不存在一项旨在网页上显示视频的标准。今天&#xff0c;大多数视频是通过插件&#xff08;比如 Flash&#xff09;来显示的。然而&#xff0c;并非所有浏览器都拥有同样的插件。 比如win…

pdf文件加密解密,pdf忘记密码解密的办法

1、pdf文件加密 步骤&#xff1a;wps》菜单“保护”》文档加密&#xff0c;设置编辑及页面密码&#xff0c;如下 2、pdf解密 在解密窗口取消选择“设置编辑及页面密码”&#xff0c;如下 注意&#xff1a;当忘记pdf密码时&#xff0c;可以使用pdf解密软件解密&#xff0c;如下…

伪类::selection自定义文本选中时的样式(CSS3样式),CSS3的word-break单次换行

1、::selection CSS3伪类自定义文本选中时的样式 有的人在浏览网页时&#xff0c;喜欢一边选中文本一边阅读。在windows环境下&#xff0c;正常的文本选中应该是深蓝色背景白色文本的样式。那么想要修改文本选中样式&#xff0c;可以通过css中有这样的一个伪类::selection用于自…

修改elementUI组件样式无效的多种解决方式

前言&#xff1a;vueelementUI项目开发中&#xff0c;经常遇到修改elementUI组件样式无效的问题&#xff0c; 原因&#xff1a;在vue组件中我们经常需要给style添加scoped来使得当前样式只作用于当前组件的节点。添加scoped之后&#xff0c;工作原理是将当前组件的节点添加一个…

CSS3 @media媒体查询 适配不同尺寸设备的响应式布局(清晰详解)

随着宽屏的不断普及&#xff0c;CSS3出现了media媒体查询技术 一、了解Media 相关知识 1、了解Media Queries Media Queries能在不同的条件下使用不同的样式&#xff0c;使页面在不同在终端设备下达到不同的渲染效果。其原理就是允许添加表达式用以媒体查询&#xff08;包括媒…