vue路由hash模式引发的血案

简介: vue路由hash模式引发的血案

背景


路径1:


xxxxx.djtest.cn/driver-regi…


路径2:


xxxxx.djtest.cn/driver-regi…


大家平常用那个什么格式的链接,路径1还是路径2????


我一直习惯用路径2,可是就在前不久出现了一个线上bug😭😭😭。 这个bug原因还是路径不规范造成的,当是我一脸懵逼,我是谁,我在哪????


url的组成


协议部分、域名部分、端口部分、虚拟目录部分、文件名部分、参数部分、锚部分



注:端口不是一个URl必须的部分,如果省略端口部分,将采用默认端口。


相信大家对于url每一部分都很了解。在这就简单提一下,就不浪费大家的时间了。


使用中遇到的问题


问题1:


【路径1】和【路径2】都能正常打开页面,它们的区别是什么,谁才是规范的url?


【路径1】锚部分



【路径2】锚部分



通过控制台的输出,我们发现两个路径打印出来的参数部分和锚部分是不一样,为啥??


url的锚部分是从“#”开始到最后,都是锚部分。锚部分不是url的必需部分。


url的参数部分是从“?”开始到“#”为止之间的部分。参数部分也不是url的必需部分。


根据url参数部分和锚部分的定义以及控制台输出的结果,我们可以得出【路径1】是符合规范url。


问题2:


由问题1得出【路径1】是符合url规范的路径。但是在开发中我发现问题又来了,用this.$route.query 无法获取参数?在页面中增加代码(如下)


created() {
    console.log('*******************')
    console.log('this.$route.query.hmsr:'+this.$route.query.hmsr)
    console.log('window.location.search:'+window.location.search)
    console.log('*******************')
}


查看打印结果


【路径1】:



【路径2】:



** why???


我查阅vue router相关文档,对此并没有说明,自己猜想应该是vue router内部做了相应的处理。


问题就来了,我们应该在项目中如何获取参数呢?


写一个获取参数的通用方法:


function getUrlParam(key) {
    var url = window.location.href;
    var startIndex = url.indexOf('?');
    var params = {};
    if (startIndex > -1) {
       var str = url.substring(startIndex + 1);
       var arr = str.split('&');
       for (var i = 0; i < arr.length; i++) {
           var kv = arr[i].split('=');
           if (kv[1].indexOf('#') > -1) {
              kv[1] = kv[1].substring(0, kv[1].indexOf('#'));
           }
           params[kv[0]] = kv[1];
        }
      }
     return params[key];
  }


【路径1】



【路径2】



注意:在传统模式开发中,如果在url中search与hash同时存在,你的hash值一定要放在search后面。


问题3:


通过上面获取参数方法,【路径1】和【路径2】都能获取到了对应的参数,这回没有问题了吧,但是想象很美好,现实很残酷。


现实是这样的,h5页面放到app中时,会在配置的路径上添加一些参数。app开发人员添加规则是在锚部分的前面添加参数。但是如果我们的页面使用vue-router进行页面跳转同时增加参数,url上就会出现双“ ?”的情况,那参数还能获取吗?



怎么办后面一个问号的参数获取不到?


方案一:优化获取参数函数,使其能获取多问号的参数


function getUrlAllParam(...args) {
       if (args.length === 0) return undefined
       const url = decodeURIComponent(window.location.href)
       const reg = args.length === 1
        ? new RegExp(`[&?]${args[0]}=([^&%#]+)`)
        : new RegExp(`[&?](?:${args.join('|')})=([^&%#]+)`)
       const matchArray = url.match(reg)
      return matchArray === null ? undefined : matchArray[1]
    }


调用:


this.getUrlAllParam('hmsr') //获取参数的key 



方案二: 不使用vue router跳转。跳转之前把要跳转的路径拼接好,再跳转,让路径中不存双问好的问题。


fomartUrl(url,params,hash){ 
    // url 是访问路径 字符串(不包含参数部分和锚部分的)
    // params 参数是数组[{name:'hmsr',value:'1222'}]
    if(!url){
      return false;
    }
    let query = '';
    if(params && params.length>0){
      let queryAttr =[];
     for(let i =0;params.length>i;i++){
       queryAttr.push(params[i].name + '=' +params[i].value)
     }
     query = queryAttr.join('&')
    } 
    if(hash){
      return url + '?' + query + '#/' + hash
    } else {
       return url + '?' + query
    }
  }


调用:


const goHref = this.fomartUrl(
 'http://localhost:8080/',
 [{name:'hmsr',value:'2222'},{name:'aaa',value:'11'}],
'outsideIndex')
window.location.href = goHref



总结:


这是在开发过程中,遇到的一些与url参数部分和锚部分相关的问题以及自己的解决方案。


相关文章
|
3月前
|
资源调度 JavaScript 前端开发
路由管理:Vue Router的使用和配置技巧
【10月更文挑战第21天】路由管理:Vue Router的使用和配置技巧
58 3
|
3月前
|
JavaScript API
vue 批量自动引入并注册组件或路由等等
【10月更文挑战第12天】 vue 批量自动引入并注册组件或路由等等
|
3月前
|
JavaScript 前端开发 API
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
956 0
|
2月前
|
JavaScript UED
"Vue实战技巧大揭秘:一招解决路由跳转页面不回顶部难题,让你的单页面应用用户体验飙升!"
【10月更文挑战第23天】在Vue单页面应用中,点击路由跳转时,默认情况下页面不会自动滚动到顶部,这可能影响用户体验。本文通过一个新闻网站的案例,介绍了如何使用Vue-router的全局前置守卫和`scrollBehavior`方法,实现路由跳转时页面自动滚动到顶部的功能,提升用户浏览体验。
118 0
|
3月前
|
JavaScript API
Vue中使用require.context()自动引入组件和自动生成路由的方法介绍
Vue中使用require.context()自动引入组件和自动生成路由的方法介绍
89 0
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1066 0
|
6天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
51 1
|
17天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
48 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
34 1

热门文章

最新文章