vue 路由知识点梳理及应用场景整理

最近做项目才发现,我确实对 vue-router 太不熟悉了,都只了解个简单用法就开始搞了,本来很简单的问题,都搞不清楚。现在重新看一遍文档,重新梳理一下。

vue 路由的原理

说实话,路由我一直也就光顾着用,没认真思考过这个问题,还是那次人家面试问了这个,我才反应过来是应该好好的了解一下了。

无刷新跳转页面,是单页应用的一大优势,用户体验好,加载速度快,vue 路由的跳转就是无刷新的,它有两种形式,可以在定义路由的时候通过 mode 字段去配置,如果不配置这个字段,那么默认使用的就是 hash 模式。
hash 模式,即通过在链接后添加 # + 路由名字,根据匹配这个字段的变化,触发 hashchange 事件,动态的渲染出页面。就有点类似像 a 链接用作页面上的锚点一样,不会刷新页面。

另外一种方式,是 history 模式,也就是使用的浏览器的 history API,pushStatereplaceState。通过调用 pushState 操作浏览器的 history 对象,改变当前地址,同时结合window.onpopstate 监听浏览器的返回和前进事件,同样可以实现无刷新的跳转页面。replaceStatepushStete 不同的就是,前者是替换一条记录,后者是添加一条记录。

有关于 pushState 的用法,详见MDN 文档。这个 API 与 ajax 合起来构成的 pjax 技术,也是用于实现页面无刷新加载的一种方式,常用于 PC 长列表页面的翻页啥的~
history 相对于 hash 模式来说,最大的好处就是没有讨厌的 # 符号,比如同样一个 list 页面,在 hash 模式下,url 链接表现为 http://yoursite.com/#/list,看着就难受。在 history 模式下面,url 链接表现为 http://yoursite.com/list ,看着比较清爽~而且~相信做过微信公众号开发的都懂,这个该死的 # 有多烦人~在下面的应用场景里面我再讲下这个问题~

那么问题来了,既然 history 模式样子好看,功能也一样,为啥还是用 hash 模式的人比较多【此处没有真凭实据,我瞎说的】?因为 history 模式,还需要服务端进行配置,否则刷新页面就会产生 404 错误。这里也比较好理解啦,因为我们实际上是使用的 pushState 操作页面的跳转,而不是真的去服务器请求另外一个 list.html 文件,那按照 http://yoursite.com/#/list 这个路径,自然找不到啦~

如果是 nginx 的服务器,在 location / 里面加上 try_files $uri $uri/ /index.html; 即可。这行代码表示:如果匹配不到静态资源的路径,就将重定向到 index 页面,这样就不会出错啦~因为需要找后端小哥哥修改服务器配置文件,如果自己没有完全理解,两边又沟通不清楚的情况下,使用 history 模式的难度无疑就大了一些~不过也不是什么大问题~全看个人需要啦哈哈~

vue 路由传参的两种方式

页面参数无非就两种,query 和 params,params 是以 /params 的形式表现在 url 上,而 query 是以 ?query=query1 这种形式表现在 url 上,此外,使用 params 参数还需要配置到路由定义上,不然不会展示在 url 上,并且刷新就会消失。

这个比较简单,需要注意的地方就是:如果传 params 参数,不能使用 path 字段跳转,否则没效果。而 query 参数则没有这个限制,使用 namepath 字段都可以。
这个虽然简单!但是一定要自己操作一遍才记得住啊。。反正我是早就看到,但是一直记混了~~重新用 demo 写了一遍才记住~而且别人说的也不一定就是对的,还是要自己实验一遍才知道呢。╮(╯▽╰)╭

vue 路由的跳转

vue 路由的跳转分成两种,一种是声明式,使用<router-link>声明跳转,to属性定义跳转的参数。另一种是编程式,使用 router.go()router.push()router.replace()方法进行跳转,go方法就是与浏览器的history api 的方法相同,可以进行返回上一页等操作。

push方法和replace方法的区别在于,前者会把当前页面加入 history 记录里面,可以通过history.go(-1)回到这个页面。而replace方法则会在 history 记录里面替换掉当前记录,如果你在跳转后的新页面返回上一页,它不会回到跳转前的页面,会回到上上个页面,如果上上个页面没有记录,则不会跳转。

vue 路由守卫

vue 路由守卫分为三种,一种是全局的路由守卫,通常在实例化路由之后设置,来做一些通用的路由操作,它所有的路由跳转都会执行的操作;一种是单个路由独享的守卫,在单个路由定义的时候进行设置,所有跳转这个路由都会执行;另外一种就是组件内的守卫,只在组件内生效。

全局路由守卫类型:

  • router.beforeEach(to, from, next)
  • router.afterEach(to, from, next)

路由独享的守卫:

  • beforeEnter(to, from, next)

组件独享的守卫:

  • beforeRouteEnter(to, from, next)
  • beforeRouteUpdate(to, from, next) —— 动态参数路径改变时,组件实例被复用的时候调用。
  • beforeRouteLeave(to, from, next) —— 导航离开组件所在路由时被调用。

vue 路由的一些应用场景处理

什么时候用 push,什么时候用 replace

最开始路由跳转我都是用 push() 比较多,或者用 go() 做返回,很少用到过 replace() ,后来在业务需求下翻文档才发现这个漏掉的 API。简单来说,当你需要从A页面跳转到B页面,再跳转到C页面,然后在C页面返回,能直接返回到A页面。那么在B页面跳转C页面的时候,使用replace()方法进行跳转即可。

动态改变页面的 title

  • 定义路由的时候,在路由的 meta 字段里面添加一个 title 属性,定义好页面的标题名称。
  • 在全局的路由守卫beforeEach()方法里面添加一个判断,获取路由的 meta 字段,动态的改变页面的 title。
// router.js
{path: '/index',name: 'index',meta: {title: '首页'}
}// main.js
router.beforeEach(to, from, next){if(to.meta.title){document.title = to.meta.title}next()  // 这个方法必须调用 不然路由不会跳转
}

微信开发,单页应用页面 url 导致的传参或者跳转失败的问题

微信授权跳转

在做微信授权跳转的时候,hash 模式下链接里面带有 # 号可能会导致重定向跳转失败,使用 encodeURIComponent 把页面地址处理之后,再传入。

let _url = encodeURIComponent(location.href)
location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appid}&redirect_uri=${_url}&response_type=code&scope=snsapi_base&state=#wechat_redirect`

获取 wxconfig 配置

前端获取 wxconfig 比较简单,主要的操作都在后端,前端只需要传一个 url 参数,由后端去获取 config 的参数,回传给前端。前端拿到参数后,调用 wx.config 方法。

let url = location.href.split('#')[0]
http.get('weixin/config',{params:{url: encodeURIComponent(url)}
})
.then(res=>{wx.config({beta: true,        // 必须这么写,否则wx.invoke调用形式的jsapi会有问题debug: false,                       // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: res.data.appId,           // 必填,企业微信的corpIDtimestamp: res.data.timestamp,  // 必填,生成签名的时间戳nonceStr: res.data.nonceStr,   // 必填,生成签名的随机串signature: res.data.signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来})// 检测微信wx.error(function(res){//  config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。console.log('错误信息====',res)})
})

单页面应用加百度统计

在单页应用上面,如果直接把百度统计的代码加到 html 不做任何处理的话,是统计不到每个页面的访问量的,所以把添加 js 和 监听跳转页面的代码都写到 main.js 里面去。

// 添加百度统计 先判断是生产环境还是开发环境 如果是开发环境 不用添加
if (process.env.NODE_ENV !== 'development') {let _hmt = _hmt || [];window._hmt = _hmt;  // 必须把_hmt挂载到window下,否则找不到(function() {var hm = document.createElement("script");hm.src = "https://hm.baidu.com/hm.js?yourappid";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})()
}router.beforeEach(to, from, next){// 添加百度统计代码 先判断是生产环境还是开发环境if (process.env.NODE_ENV !== 'development') {// 添加页面统计if (_hmt) {if (to.path) {_hmt.push(['_trackPageview', '/#' + to.fullPath]);}}}
}

参考文档:
https://segmentfault.com/a/1190000011967786
https://www.jianshu.com/p/febd38110645

转载于:https://www.cnblogs.com/linxue/p/10293893.html

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

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

相关文章

dct变换的主要优点有哪些_发泡保温材料包括哪些成分?主要优点是什么?有没有发展前景?...

在各个行业中&#xff0c;对发泡保温材料都有需求。随着这种材料越来越受欢迎&#xff0c;更多人开始关注它的成分与优点。了解的越多&#xff0c;越容易在合适的场合令其发挥功效。组成成分有哪些&#xff1f;对于发泡保温材料来说&#xff0c;包括甲组和乙组两部分。所谓的甲…

企业集成模式_企业集成模式简介

企业集成模式在此博客文章中&#xff0c;我们将介绍一些企业集成模式。 这些是旨在解决集成挑战的已知设计模式。 阅读此书后&#xff0c;您将可以设计集成解决方案。 EIP&#xff08;简而言之&#xff09;是已知的设计模式&#xff0c;可为应用程序集成过程中面临的问题/问题…

win7安装

以Dell电脑为例&#xff0c;其他品牌电脑类似 Dell安装win7 一&#xff1a;快捷启动U盘或光盘的方法&#xff1a; 1&#xff0c; 打开戴尔Dell电脑&#xff0c;当进入到标志画面时&#xff0c;马上按键盘上方的F12键&#xff0c;就能进入到快捷启动菜单。 2&#xff0c; 进…

【Bootstrap】 框架 栅格布局系统设计原理

前提条件&#xff08;Bootstrap 自带&#xff09; 首先使用这个布局之前要定义一下代码&#xff1a; 这行代码如果不懂&#xff0c;可以搜索一下&#xff0c;总之大致意思就是&#xff0c;被定义的元素的内边距和边框不再会增加它的宽度&#xff0c;不加入的话排版会有问题。 不…

asp.net接受表单验证格式后再提交数据_药物临床试验数据管理与统计分析的计划和报告指导原则...

来源&#xff1a;国家药监局网站一、前言规范的数据管理计划有助于获得真实、准确、完整和可靠的高质量数据&#xff1b;而详细的统计分析计划则有助于保证统计分析结论正确和令人信服。为保证临床试验数据的质量和科学评价药物的有效性与安全性&#xff0c;必须事先对数据管理…

使用Spring Boot应用程序将代码管道化

这是有关基于本地Docker compose堆栈的持续交付的一系列帖子中的最后一篇&#xff08;请参阅此处的第一篇和第二篇文章 &#xff09;。 在这篇文章中&#xff0c;我使用一个简单的Spring Boot项目来展示如何利用“ 管道作为代码 ”的概念。 请注意&#xff0c;这仅是示例&#…

matlab function的使用

首先创建一个m文件&#xff1b; Matlab函数定义格式&#xff0c;用关键字function定义函数 function [输出变量] 函数名称(输入变量&#xff09; % 注释 % 函数体 简单的函数如下&#xff1a; function [a,b,c]test(d,e,f) ade; bef; cfd; end 函数的调用&#xff1a; …

关键词热度分析工具_阿里国际站外贸独立站关键词的收集

很多朋友在做外贸独立站SEO和阿里巴巴国际站的时候&#xff0c;一定要查找收集一定数量的关键词&#xff0c;并且按照关键词的热度和词品相关性进行分类&#xff0c;从而为后面阿里巴巴国际站发布产品或者独立站谷歌推广打下坚实的基础。所谓磨刀不误砍柴工&#xff0c;好的关键…

matlab区分卷积和相关

区分卷积和相关 图像处理中常常需要用一个滤波器做空间滤波操作。空间滤波操作有时候也被叫做卷积滤波&#xff0c;或者干脆叫卷积&#xff08;离散的卷积&#xff0c;不是微积分里连续的卷积&#xff09;&#xff1b;滤波器也有很多名字&#xff1a;卷积模版、卷积核、掩模、…

2345电脑管家_2345软件管家下载|2345软件管家 2.0 官方正式版

对于很多类似的软件而言&#xff0c;这一款软件在互联网行业也不算无名之辈&#xff0c;毕竟你都搜索到这里&#xff0c;也是认可了这款软件的地位和作用。而且看最新的版本迭代&#xff0c;也有一些比较欣喜的变化&#xff0c;是以前版本所没有的。2345软件管家功能介绍 新一代…

matlab imwrite将图像保存到其他目录

%读入C:\desktop 文件夹下图片test.jpg imgimread(C:\desktop\test.jpg); %用imwrite将图片写入到D:\目标 文件夹下&#xff0c;并重命名为img_propose.jpg imwrite(img,D:\目标\img_propose.jpg);

设计模式 原型模式_原型设计模式:创建另一个小车

设计模式 原型模式创建对象确实是一个耗时的过程&#xff0c;也是一件昂贵的事情。 因此&#xff0c;我们现在正冒险节省时间和金钱。 我们该怎么做&#xff1f; 克隆奇迹多莉 有人记得多莉吗&#xff1f; 是的&#xff0c;是绵羊&#xff0c;是第一个被克隆的哺乳动物。 好吧…

实验四:三角形判断

本次实验问题稍多&#xff0c;出租车计价一题逻辑比较简单&#xff0c;就是情况比较多&#xff0c;在多次尝试后才让程序成功运行。而三角形的判断一题中主要出现了以下几点错误 1.else 和 if 语句不搭配 2.对三角形成立的条件理解不正确&#xff08;是任意两边之和大于第三…

电脑键盘上每个键的作用_眼看着淡出大众视野 键盘上Esc键的隐秘往事

众所周知&#xff0c;苹果一些新的Macbook产品线不仅取消了Esc键&#xff0c;而且还对通常用于多数计算机键盘的功能键布局进行了变更。它们有的被转移到了TouchBar&#xff0c;有的则被永久取消掉了。那个常标配于每个键盘的Esc键&#xff0c;眼看着却有淡出大众视野的趋势——…

matlab save将变量值保存为mat

将变量a的值保存到.mat文件中 save(object.mat,a)

开发人员的新分布式基元

面向对象的原语&#xff08;进程中的原语&#xff09; 作为Java开发人员&#xff0c;我非常熟悉面向对象的概念&#xff0c;例如类&#xff0c;对象&#xff0c;继承&#xff0c;封装&#xff0c;多态性等。除了面向对象的概念之外&#xff0c;我还非常熟悉Java运行时。它提供的…

LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

LOJ洛谷 这题不就是Peaks(加强版)或者归程么。。这算是\(IOI2018\)撞上\(NOI2018\)的题了&#xff1f;\(Kruskal\)重构树&#xff08;具体是所有点按从小到大/从大到小的顺序&#xff0c;依次加入这些点的边&#xff09;&#xff0c;我们可以得到两棵树&#xff08;和那两题不一…

b站在线解析_这款游戏被全B站所唾弃,每个月却依然有5000万玩家坚持在线?!...

彩虹 | 视频安妮 | 编辑《迷你世界》&#xff0c;相信不少人都听过这个名字。这是个非常神奇的游戏&#xff0c;当然并不是指这个游戏很有自己的特色或者有趣的玩法。它神奇的地方在于你随便在bilibili挑一个有关《迷你世界》的视频打开&#xff0c;弹幕都是“呕”、“开炮”、…

linux 安装软件

安装软件 下载软件的源网址所放目录 vi /etc/apt/sources.list sudo apt-get update 更新源 sudo apt-get install xxx 安装软件&#xff0c;xxx为软件名 sudo apt-get build-dep xxx 安装相关的编译环境 sudo apt…