zoukankan      html  css  js  c++  java
  • vue 路由切换页面再次进入更新数据

    一:同一项目中路由的跳转

    mounted和created都只能执行一次,尝试监听改变的数据也未起效果,项目中使用了<keep-alive>,所以用activated监听初始函数

     1.需要跳转的页面home.vue:   页面每次跳转时都改变参数,通过获取不同的时间来实现地址如:http://localhost:8080/#/noticeDetail?time=1641284450820

     2.路由设置为不缓存上次的数据

    {
            path: "/noticeDetail",
            name: "noticeDetail",
            component: pages.noticeDetail,
            meta: {
                title: "公告信息",
                code: "noticeDetail",
                noCache:false 
            }
        },
    

    3.跳转目标页面noticeDetail.vue实现监听:

     activated(){ //项目使用了keep-alive,所以用activate监听才会再次刷新数据
         this.init();//初始化页面
     },
    

     二、从公共框架中跳转到同一个路由,直接用this.$router.push()的话因为是同一个页面会报错,并且页面数据也不更新

     

     解决:1.解决页面报错 NavigationDuplicated: Avoided redundant navigation to current location: "/",原因是路由重复。 

              在 router 文件夹下的 index.js 中加入下面代码,解决!

             

     const originalPush = VueRouter.prototype.push
      VueRouter.prototype.push = function push(location) {
            return originalPush.call(this, location).catch(err => err)
       }
    

     2.解决路由数据不刷新的问题:先判断当前路由是否是重复的路由,如果是的话就删掉重新加载并且再次reload()

     会有一个问题就是页面原先打开的所有的路由都关了  只保留了最后加载的这个路由,目前没找到好的解决办法

             const time = Date.now();
                sessionStorage.setItem('noticeDetail',JSON.stringify(params));
                // 先关闭当前页面再打开解决第二次打不开页面的问题
                if(this.$route.name=="noticeDetail"){
                  this.store.delView(this.$route); //前面用inject引入store,所以可以这样写
                  this.$router.push({path:'/noticeDetail',query:{time}});
                  setTimeout(()=>{
                    location.reload();
                  },0)
                }else{
                  this.$router.push({path:'/noticeDetail',query:{time}});
                }    
    

     针对第二种的优化方案:

     用watch监听路由,即使是不同项目之间的跳转也可以监听到路由的变化,之后再次调用接口实现页面刷新数据渲染

    watch: {
                $route(to) {  // 先关闭当前页面再打开解决第二次打不开页面的问题
                  if (this.$route.name=='noticeDetail') { //noticeDetail为当前打开的这个页面的路由
                    // console.log("进来panduan");
                    this.init();//后续业务逻辑处理
                  }
                }
            },
    

      



  • 相关阅读:
    PaaS 7层动态路由的若干实现
    05-OC对象的内存分析
    04-类与对象的练习(第二个OC的类)
    03-类的声明和实现(第一个OC的类)
    02-类与对象的关系
    01-面向对象和面向过程
    06-BOOL类型的使用
    05-初识OC多文件编程(第4个OC程序)
    04-初识OC多文件编程(第3个OC程序)
    03-第二个OC程序
  • 原文地址:https://www.cnblogs.com/changyuqing/p/15762982.html
Copyright © 2011-2022 走看看