vue刷新当前路由:router-view 复用组件时不刷新的3种解决方案总结

摘要:
在vue路由器单页应用程序中,它是路径之间的切换,即组件的切换。对于路线,不同的路线跳跃,vue将帮助我们刷新路线,但我今天想说的是,相同的路线刷新了我们的解决方案。因为路由器视图是可重用的,所以简单地更改ID号不会刷新路由器视图,这不是理想的结果。当然,我们可以在点击事件Go中添加路由器,强制整个页面刷新以达到效果。当ID更改时,“$route”也会相应更改,因此您可以使用watch方法进行操作。

  vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。

  对于路由,不同的路由跳转,vue会帮我们刷新路由,但是我今天要说的是,同一路由刷新我们的解决方法。

问题背景:

  点击用户头像 => 进入用户个人中心,在用户个人中心里点击其他用户的头像,我希望显示被点击用户的个人中心,但只看到了路由参数在发生变化,页面内容并没有更新。

<script>
    export default {
        data() {
            return {
                data: {}
            }
        },
        methods: {
          fetchDate() {
          // 使用 axios获取数据
          ......
        },
        created() {
          this.fetchDate();
        }
    }
</script>

解决办法:

  使用 watch,观察路由,一旦发生变化便重新获取数据!

<script>
    export default {
        data() {
            return {
                data: {}
            }
        },
        methods: {
          fetchDate() {
          // 使用 axios获取数据
          ......
        },
        created() {
          // 组件创建完后获取数据,
          // 此时 data 已经被 observed 了
          this.fetchDate();
        },
        watch: {
          // 如果路由有变化,会再次执行该方法
          "$route": "fetchDate"
        }
    }
</script>

拓展学习

  在使用Vue-router做项目时,会遇到如/serviceId/:id这样只改变id号的场景。由于router-view是复用的,单纯的改变id号并不会刷新router-view,而这并不是我们所期望的结果

  当然,我们可以在点击事件上加上router.go(0),强制刷新整个页面来满足效果。但页面整体的刷新会使体验下降,并且作为个人也不是很能接受这样的方法。在查阅了一些资料后,发现可以有以下两种方法可以解决问题。

1、使用watch方法

  watch方法据说是官方推荐的方法(抱歉,我没好好看文档)。当id发生变化时,'$route'也会相应地发生变化,因此可以通过watch的方法来进行操作

watch: {
  '$route': function (to, from) {
        // 我这里还是用了Vuex,不过应该不影响理解
        this.$store.dispatch('updateActiveTemplateId', this.$route.params.templateId)
        // 通过更新Vuex中的store的数据,让数据发生变化
        this.getTemplateById()
  }
},

2、通过改变router-view中的key来达到刷新组件的目的,我现在用的就是这种方法(因为我使用的按需加载,所以加载组件也不会加载所有界面)

<router-view :key="activeDate"></router-view>
//我用了一个简单粗暴的方式来改变key,时间戳(捂脸)
//this.activeDate = new Date()

3、还有一种官方文档的方法

  后来看博客有了新方案——beforeRouteLeave

  在组件内直接使用,前提是你用了vue-router:

beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
}

免责声明:文章转载自《vue刷新当前路由:router-view 复用组件时不刷新的3种解决方案总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Dubbo-深入配置【Python学习】pip 常用命令及控制台怎么查看python 及pip 和已安装包版本号(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue路由跳转页面的几种方式及其区别

场景:A页面跳转到B页面并携带参数 方案一:声明式导航router-link 1.1不带参数: // 注意:router-link中链接如果是'/'开始就是从根路由开始,如果开始不带'/',则从当前路由开始。 <router-link :to="{name:'home'}"> <router-link :to="{path:'/hom...

Vue数据可视化组件:DataV

组件库名称:DataV 项目地址:https://github.com/DataV-Team/DataV 文档地址 贴几个Demo图 DataV是一个基于Vue数据可视化组件库,类阿里DataV,提供SVG的边框及装饰,图表,飞线图等组件,简单易用。 主要的组件类型 SVG的边框,主要用于提升页面效果,一个边框组件仅几k到十几k,后期会添加颜色之类的配置...

vue下实现WebRTC

1.1 WebRTC简介 WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的实时通信框架,提供了一系列页面可调用API。 参考定义: 谷歌开放实时通信框架 在上一篇博客Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互 中...

ant-design-vue 之form表单中label-col和wrapper-col使用

ant-design-vue 之form表单中label-col和wrapper-col使用 主要代码: :label-col="{ span: 5 }" :wrapper-col="{ span: 15 }" demo: <template> <div> <a-form :form="form" &g...

vue项目部署到nginx服务

vue开发的项目,通过编译会得到 dist文件夹,如何发布到nginx服务器上? 配置nginx服务器 在nginx服务文件中,打开 conf文件夹 为了不改变nginx的默认配置(nginx.conf),复制一份,重名为 custom.conf 修改 custom.conf 文件中的 root 参数为 custom ...... server...

vue 项目中使用 wangEditor

1,vue中安装wangEditor  使用的npm安装 npm install wangeditor --save 2,创建公用组件  在components中创建wangEditor文件夹 组件内容为 <template lang="html"> <div class="editor"> <div ref="t...