美文网首页
vue中实现刷新路由

vue中实现刷新路由

作者: 超人鸭 | 来源:发表于2020-08-11 15:28 被阅读0次

有时候有这样的场景,需要重新加载当前的页面,但不是像刷新浏览器一样刷新整个网站,那样如果有全局保存的数据(比如vuex的数据,当前页面的路由参数)就会重置,所以需要实现刷新当前路由。

实现先说一个属性:router.replace
replacepush用法基本一样,但不会在浏览器留下history记录,就是当你使用replace访问的路径,通过浏览器的前进后退按钮都访问不到。

image.png

实现的方法有点投机取巧,就是建立一个空页面,通过router.replace访问,再从空页面使用router.replace跳转回来,达到刷新当前路由的效果。下面是基础实现:
先建立一个组件做空页面,refresh.vue

<template>
  <div></div>
</template>

<script>
export default {
  beforeRouteEnter (to, from, next) {
    next(vm => {
      vm.$router.replace(from.path)
    })
  }
}
</script>

通过使用组件的路由前置守卫返回上一个页面,需要注意的是在这个守卫中访问不到this实例,需要通过在next回调中的参数代表平时的this
再建立这个空页面的路由信息:

  {
    path: '/refresh',
    name: 'refresh',
    component: () => import('@/views/refresh/index')
  }

最后在你需要刷新路由的组件中的方法中访问该路径即可:

refreshPage () {
  this.$router.replace({
    path: '/refresh'
  })
}

这样算是完成一个乞丐投机取巧版的刷新当前路由,这种方法是有瑕疵的,当刷新的路由带有参数,params或者query,通过这个刷新方式之后参数就会丢失,所以需要将上面的方法加以改造一下,让参数页面的参数保持不变,先从需要刷新路由的组件的方法改造:

refreshPage () {
  if (Object.keys(this.$route.params).length) {
    this.$router.replace({
      name: 'refresh',
      params: this.$route.params
    })
  } else {
    this.$router.replace({
      path: '/refresh',
      query: this.$route.query
    })
  }
}

这样兼容了路由中带有paramsquery,先判断了当前路由是否有params属性,如果当前路由没有paramsquery属性,默认都是空对象,所以传递一个空对象跟没传是一样的。注意路由跳转传递paramsquery的方式不相同,传递params时,不能使用路由的path,需要用到路由name属性,所以上面分了情况进行跳转。这样跳转到写好的空页面,参数是传递给refresh这个路由,所以需要再从这个空页面传递回来,下面是改造后的refresh组件:

<template>
  <div></div>
</template>

<script>
export default {
  beforeRouteEnter (to, from, next) {
    next(vm => {
      if (Object.keys(to.params).length) {
        vm.$router.replace({
          name: from.name,
          params: to.params
        })
      } else {
        vm.$router.replace({
          path: from.path,
          query: to.query
        })
      }
    })
  }
}
</script>

在这个路由守卫中,to就代表当前页面,也就是refresh组件

改造后这个刷新路由的方式就兼容了路由带有参数的情况,目前超人鸭遇到的需求这种方式已经能满足,如果还有其他情况需要再做处理的,或者有更好的实现方法,欢迎指教哦。

相关文章

  • keepAlive使用方法

    vue单页面,多路由,前进刷新,后退不刷新 目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷...

  • vue中实现刷新路由

    有时候有这样的场景,需要重新加载当前的页面,但不是像刷新浏览器一样刷新整个网站,那样如果有全局保存的数据(比如vu...

  • 前端常见面试题(九)vue路由

    目录: 1,Vue路由的实现原理 ❤ 2.SPA 路由history模式上线后刷新404 ❤ 3,$route和$...

  • 前端常见面试题九

    目录 1、Vue路由的实现原理 2、SPA 路由history模式上线后刷新404 3、$route和$route...

  • vue-router用法

    vue 路由 路由点击跳转不会页面刷新,可以保留数据 安装vue-router:npm install vue-r...

  • 【源码】vue-rotuer1 原理

    大纲hash路由history路由vue-router简单实现vue中的数组,对象添加属性的监听 (1)Hash ...

  • Vue路由this.$router.push跳转页面不刷新

    一、背景 介绍:在vue项目开发中,使用路由进行页面跳转时,路由所跳转的页面不进行刷新。也就是vue生命周期函数没...

  • SPA 前端路由无刷新更新原理

    目前主流的前端 SPA 框架如:React/Vue 是通过 Hash 和 History 两种方式实现无刷新路由。...

  • vue小总结

    MVVM模式: Vue就是基于MVVM模式实现的一套框架,在Vue中 路由 VUEX .vue文件

  • 1.16、路由

    十六、路由 1.什么是路由 在vue中的路由,能够帮组我们在一个vue组件中实现其他组件的相互切换。也就是说,可以...

网友评论

      本文标题:vue中实现刷新路由

      本文链接:https://www.haomeiwen.com/subject/wxqydktx.html