普通的vue项目使用this.$router.go(-1)就能同时实现后退+刷新了。

但是在vue-element-admin或其他复杂的项目中(尤其是后台管理系统),有独特的路由跳转配置,比如在vue-element-admin中使用this.$router.go(-1),原页面的数据并不会刷新,因为配置了快捷导航(标签栏导航)
在这里插入图片描述
该方案运用了 keep-alive 和 router-view 的结合,所以跳转路由后原页面的数据仍然存活。


解决方案:

①、首先,找到页面恢复初始化数据的方法,我采用的是以下方法:

Object.assign(this.$data, this.$options.data())

②、接下来,只要实现逻辑:在路由改变时,执行①的方法,就大功告成了。
判断路由是否改变的方法也很多,可以使用路由守卫钩子,如:

beforeRouteEnter(to, from, next) {
    console.log(this, 'beforeRouteEnter'); // undefined
    console.log(to, '组件独享守卫beforeRouteEnter第一个参数');
    console.log(from, '组件独享守卫beforeRouteEnter第二个参数');
    console.log(next, '组件独享守卫beforeRouteEnter第三个参数');
    next(vm => {
      //因为当钩子执行前,组件实例还没被创建
      // vm 就是当前组件的实例相当于上面的 this,所以在 next 方法里你就可以把 vm 当 this 来用了。
      console.log(vm);//当前组件的实例
    });
  },

而我选择更为简洁的方法,使用watch监听route路由变化:

  watch: {
    '$route'() {
      // 若路由产生变换(退出或提交成功切换回上一页时),将页面数据重置为初始值
      Object.assign(this.$data, this.$options.data())
      // 此处别忘了加上created里需要执行的请求,因为在keep-alive的单页面中切换路由不会执行created钩子
    }
  },

THX~

Logo

快速构建 Web 应用程序

更多推荐