问题一:
// 动态路由
/detail/:id

问题:
动态路由跳转的时候,页面是不刷新的,相信很多人都遇到了相同的问题
解决方法:
在全局的router-view组件上设置一个key值,此key值为一个时间戳或者随机字符,对于keep-alive的组件不做这个处理。

问题二:

router.go(0)

问题:
这种写法本质上是想达到刷新当前页面的目的,但是在一些浏览器上不兼容,主要是ios,webview上也会出现问题,动作并不会触发
解决方法:
使用window.location.reload()来代替,如果项目中使用了vuex的话,这种做法会导致状态清空,需要自己把握,还有另外一种处理方式,就是在列表页删除某一个项操作,操作完成需要重载,这时就可以使用异步请求来达到效果。更多的情况下,我们是想重置一些表单元素的值,或者大量的数据重置,这种情况可以试试
```
Object.assign(this.$data, this.$options.data())
```
问题三

hash模式在微信场景下的一个问题,当我们发起一个微信授权链接时,微信会返回一个code字段,和一些其他的参数,这些参数以query的形式连接,并且code的有效期很短,单页几乎每次都要重新授权。那么第二次授权的时候这些参数并不会从链接里消失,会一直带着,影响了第二次授权。
解决方法:
授权之前检测链接里是否有code参数,有的话就不能使用location.href作为微信的redirect_url参数,看代码
```
let oldCode = this.getQueryString('code') ;
let temp = '' ;
if( oldCode ){
  temp = window.location.origin + window.location.hash ;
}else{
  temp = window.location.href ;
}
```
这样还不能彻底避免链接中带有老的code参数的问题
我们还需要进一步处理,通常的业务是支付或者登陆完成是要进行跳转的,这个时候就不要使用vue-router的router.push||router.replace等等的跳转了,我们需要把链接中的其他多余参数干掉,避免影响,通常使用href跳转,具体要跳转到哪就看业务需求了。

 问题四

页面授权问题,通常我们的实际业务流程中,有很多页面是需要登录授权之后才能进入的。
解决方法
这时我们需要对路由进行一些处理,例如这样定义一个路由
```
   {
      path : '/demand' ,
      component : demand ,
      meta : { requiresAuth : true }
    }
```
我们在进入路由之前进行验证
```
router.beforeEach((to , from , next) => {
// 判断是否带有特殊标记
  if( to.matched.some( record => record.meta.requiresAuth ) ){
    let login = getSession( 'login' ) ;// 验证是否登录
    if( !login ){
      next({
        path : '/login', // 登录页
        query : { redirect : to.fullPath }
      })
    }else{ next() }
  }else{ next() }
  // 需要注意的是这里的next()方法一定要调用,不然会阻塞路由,导致页面不会正常跳转
})
```

问题五

微信分享出来的链接带有一些其他的参数,比如从app分享出来的会有一个from=singlemessage的参数,是加在域名后面的,还有朋友圈from=timeline等等。
```
http://www.watergourd.com/?from=singlemessage#/index
```
这样的形式会影响我们正常的路由系统,导致一系列的问题
解决方法:
```
router.beforeEach((to , from , next) => {})
```
还是在这个钩子里处理,通过 
```
let reg = /singlemessage|timeline/g
``` 
这样的正则来判断是否包含这些参数,包含的话就干掉,从新跳转,我最早的处理方式是在index.html的头部来处理,后面发现有时成功,有时失败,才考虑到在进入路由系统之前来处理这些。

问题六

分享出来的页面点进去为首页,这个问题非常棘手,由于涉及到第三方,调试起来也麻烦,一般的本地开发环境是没办法测试的。

解决方法:

首先应该保持路由参数的清洁,然后把页面的路由都定义在空path之前,也就是说所有的异常路由都放到最后,特别是空path的这种情况,有些人的处理是把'/'定义在最前面,然后用重定向的方式导到首页,后面我发现这种处理容易出问题
```
const routes = [ 
    {
      path : '/checkstandSuccess',
      component : checkstandSuccess
    },
    // 异常路由处理------------------
    {
      path : '/' ,
      redirect : '/home'
    },
    // 404页面
    {
      path: '*',
      component: NotFoundPage
    }
]
```

问题七

keep-alive导致的问题,通常我们需要缓存一些静态页面,但是有时候我们也需要通过一些状态或者参数来刷新页面,这时我们就需要更新缓存

解决方法:

定义:在路由信息中配置keep-alive为true时,将会缓存当前页面,第一次进入一个缓存的页面时,vue的生命周期执行的顺序为created() -> mounted() -> activated(),这里的activated()钩子只存在于keep-alive为true的路由页面,之后每次进入这个缓存页面的时候,都不会再去执行vue的生命周期,而是从缓存里面拿,只有activated()钩子在每次进入这个缓存页面是才会执行,当然还有一个钩子deactivated()是在离开页面的时候会执行.
这里就存在一个坑,当我们需要通过子组件或者其他的页面传递的 参数,来更新这个缓存页面的DOM时,发现按正常逻辑处理数据获取的部分一直不会调用,这时就要在activated()里面也放一分请求数据的逻辑,来更新dom.这只是其中的一种解决办法。
第二种办法是,通过beforeRouteEnter()和beforeRouteLeave()这两个钩子来解决,注意这两个钩子是在vue2.2之后才能使用。例如在搜索页输入关键字,跳转到列表页进行数据获取,而列表页是keep-alive为true的,那么此时我们只需要在搜索页的生命周期中配置
beforeRouteLeave(to,from,next){
    to.meta.keepAlive = false;
    next();
    }
就ok了,to表示即将要进入的页面的路由对象,通过更改keepAlive属性,以达到更新列表页的目的。还有一种情况,就是从列表页到详情页的时候,往往都需要缓存列表的筛选条件或者结果,那么在列表页的beforeRouteLeave()中配置from.meta.keepAlive=true,就可以了,那么再次从详情页返回列表的时候,列表筛选结果的状态还存在 这种体验,就相当到位了。
---------------------
作者:water-gourd
来源:CSDN
原文:https://blog.csdn.net/zhang_fox/article/details/80178986
版权声明:本文为博主原创文章,转载请附上博文链接!

vue-router(hash模式)常见问题以及解决方法的更多相关文章

  1. vue 移动端/PC常见问题及解决方法

    一.判断手机/PC浏览器语言 navigator.language // 返回语言代码 语言代码文档: http://www.lingoes.cn/zh/translator/langcode.htm ...

  2. vue.js开发SPA常见问题及解决方法

    列表进入详情页的传参问题. 例如商品列表页面前往商品详情页面,需要传一个商品id; <router-link :to="{path: 'detail', query: {id: 1}} ...

  3. NHibernate常见问题及解决方法

    NHibernate常见问题及解决方法 曾经学过NHibernate的,但是自从工作到现在快一年了却从未用到过,近来要巩固一下却发现忘记了许多,一个"in expected: <end ...

  4. C#用ado.net访问EXCEL的常见问题及解决方法

    C#用ado.net访问EXCEL的常见问题及解决方法,除了像sql server,access常见的数据库,其实Excel文件也可以做为数据库访问. ado.net访问excel的实例: OleDb ...

  5. Nacos 常见问题及解决方法

    Nacos 开源至今已有一年,在这一年里,得到了很多用户的支持和反馈.在与社区的交流中,我们发现有一些问题出现的频率比较高,为了能够让用户更快的解决问题,我们总结了这篇常见问题及解决方法,这篇文章后续 ...

  6. vue router mode模式在webpack 打包上线问题

    vue-router mode模式有两种 hash和history. 1.hash —— 即地址栏 URL 中的 # 符号.比如这个 URL:http://www.abc.com/#/hello,ha ...

  7. Vue中hash模式和history模式的区别

    vue-router 中hash模式和history模式. 在vue的路由配置中有mode选项,最直观的区别就是在hash模式下的地址栏里的URL夹杂着‘#’号 ,而history模式下没有.vue默 ...

  8. Direct3D11学习:(零)常见问题及解决方法整理

    转载请注明出处:http://www.cnblogs.com/Ray1024   一.概述 在D3D11学习的这个系列中,单独写一篇文章来记录自己学习过程中遇到的问题及最后的解决方法. 这篇文章的目的 ...

  9. 安装scrapy框架的常见问题及其解决方法

    下面小编讲一下自己在windows10安装及配置Scrapy中遇到的一些坑及其解决的方法,现在总结如下,希望对大家有所帮助. 常见问题一:pip版本需要升级 如果你的pip版本比较老,可能在安装的过程 ...

随机推荐

  1. asp.net core 系列 4 注入服务的生存期

    一.服务的生存期 在容器中每个注册的服务,根据程序应用需求都可以选择合适的服务生存期,ASP.NET Core 服务有三种生存期配置: (1) Transient:暂时生存期,在每次请求时被创建. 这 ...

  2. C++版 - 剑指offer面试题14: 调整数组顺序使奇数位于偶数前面

    题目: 调整数组顺序使奇数位于偶数前面 热度指数:11843 时间限制:1秒 空间限制:32768K 本题知识点: 数组 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇 ...

  3. C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数

    数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...

  4. Android--从系统Gallery获取图片

    前言 在Android应用中,经常有场景会需要使用到设备上存储的图片,而直接从路径中获取无疑是非常不便利的.所以一般推荐调用系统的Gallery应用,选择图片,然后使用它.本篇博客将讲解如何在Andr ...

  5. 在Mac上使用远程X11应用

    XWindows太老了,历史比Windows和Linux的开发时间都长,以至于很多人每天实际在用,但已经不知道它的存在. XWindows目前是Linux/类Unix系统上的标准显示配置,QT/GTK ...

  6. 带着新人学springboot的应用08(springboot+jpa的整合)

    这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...

  7. MongoDB Export & Import

    在使用MongoDB数据库的过程中,避免不了需要将数据进行导入和导出的工作,下面为具体的用法.注意 不同的数据库版本可能存在略微的差异,所以在使用时,先查看 --help 来进行确认.下面的为3.6版 ...

  8. 【java】随机生成6位的数字

    int radomInt = new Random().nextInt(999999); int radomInt2 =(int)((Math.random()*9+1)*100000); Syste ...

  9. java之equals 与 == 的区别

    == : 1.本质:比较的的是地址,栈内存中存放的对象的内存地址. 2.判断引用所指的对象是否是同一个. 3.两边的操作数必须是同一类型的(可父子类)才能编译通过. 4.值类型(int,char,lo ...

  10. JAVA程序员学PHP

    工作之余,趁着五一假期学习下PHP,都说PHP是世界上最美的语言,而且现在应用的有这么广泛,在短期时间内在编程的市场上打得火热,好奇心趋势我去学习一下,下面便是我学习PHP记录下来的过程,和大家分享一 ...