vue 路由跳转保留页面缓存和滚动位置

news/2024/7/10 2:08:56 标签: vue, js

业务场景:

在a页面滑动列表,点击进入b页面,再返回a页面时,a页面保留滑动的位置和页面缓存。

解决思路:

使用路由的keepAlive方法,keepAlive为true就会保留页面缓存。(返回该页面不会执行created和mounted)。

  1. app.vue使用缓存机制。
  2. a页面跳转到b页面时,设置a页面的keepAlive为true、保存页面滚动高度。
  3. 路由守卫判断去的页面不是b页面就将keepAlive改为false,防止别的页面跳转到a页面还有缓存。
  4. 在activated恢复页面滚动高度。

解决方法:

vue_16">1.app.vue。使用缓存机制。

<template>
  <div id="app">
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"/>
    </keep-alive>
    <router-view  v-if="!$route.meta.keepAlive">
     <!--因为用的是v-if 所以下面还要创建一个未缓存的路由视图出口-->
    </router-view>
  </div>
</template>

注意keepAlive对应路由里面keepAlive大小写

jsbkeepAlivefalse_32">2.router.js。路由离开事件里判断要去的不是b页面就设置当前页面keepAlive为false。

防止别的页面跳转到a页面还有缓存,不会执行created和mounted。to.name严格区分大小写。

Vue.mixin({
beforeRouteLeave: function (to, from, next) {
    // 去的不是b页,不需要缓存
    if (to.name != 'b') {
      this.$route.meta.keepAlive = false
    }
  }
})

如果还有更多,就这样判断

Vue.mixin({
beforeRouteLeave: function (to, from, next) {
    // 去的不是bcd……页,不需要缓存
    if (to.name != 'b' && to.name != 'c' && to.name != 'd') {
      this.$route.meta.keepAlive = false
    }
  }
})

3.a页面 data中定义一个scroll变量

scroll: 0, //定义初始滚动高度

设置ref=“wrapper”,ref设置在滚动的div上。

<div ref="wrapper"></div>

a页面跳转到b页面时,设置a页面的keepAlive为true、保存页面滚动高度

method(){
       //点击跳转到b页面
      clickItem(item) {
        let wrapperScrollTop = this.$refs.wrapper.scrollTop;//获取滚动高度
        this.scroll = wrapperScrollTop; //保存滚动高度到scroll变量
        this.$route.meta.keepAlive = true //点击跳转b页面之前,将a页面的keepAlive设置为true
        this.$router.push({
          name: "b",
        })	//跳转到b页面
      },
},

4.a页面在activated方法里,将页面滚动到之前的位置。

//挂载后和更新前被调用的。但如果该组件中没有使用缓存,也就是没有被<keep-alive>包裹的话,activated是不起作用的
activated() {
      this.$nextTick(() => {
        this.$refs.wrapper.scrollTop = this.scroll;	//恢复滚动高度
		//其他操作
        })
 },

获取滚动距离的方法有很多,这样的比较好操作。

题外话

如果想要c页面返回a页面时,a页面不要缓存。可以在路由守卫这样写

//从c去a,a不保留缓存
   if(from.name == "c" && to.name == "a"){
     to.meta.keepAlive = false
   }

http://www.niftyadmin.cn/n/1239829.html

相关文章

启动云服务器出错了,腾讯云服务器启动lightdm遇到“Active: failed (Result: start-limit)”错误解决方法...

我在腾讯云服务器上安装图形界面&#xff0c;在启动lightdm时失败了&#xff1a;[rootVM_0_11_centos gdm]# systemctl start lightdm[rootVM_0_11_centos gdm]# systemctl status lightdm● lightdm.service - Light Display ManagerLoaded: loaded (/usr/lib/systemd/system/…

vue集成 xgplayer西瓜播放器的组件封装。画面卡停重连。

前言 设置画面卡死重连机制是因为 长时间测试下&#xff0c;发现有时候画面会卡死&#xff0c;然后不会自动恢复播放。 参考了这位大佬的帖子&#xff0c;卡住是因为服务器webSocket推流断开了又迅速继续推流&#xff0c;播放插件无法继续播放。 https://blog.csdn.net/HJFQC/…

游戏服务器停服维护公告,《黑潮之上》2020年12月22日全服务器停服维护公告

在黑潮之上手游中2020年12月22日更新了哪些有趣的内容呢&#xff1f;不清楚本次维护更新内容如何的话&#xff0c;下面就来看一下吧&#xff01;各位接触者为了提供良好的游戏体验&#xff0c;保证服务器稳定运行&#xff0c;《黑潮之上》将于2020年12月22日早5:00开始进行全服…

vue 地址栏#号前随意输入字符问题

问题&#xff1a; 地址栏#号前随意输入字符&#xff0c;也能跳转页面使用&#xff0c;有些接口能用。但是有些接口404。 解决方法&#xff1a; 在路由拦截增加这段判断&#xff1a; // 判断#号前的地址是否正确 let wPath window.location.href; //页面地址 let current…

通过ajax跨域请求传输formdata,使用ajax跨域调用springboot框架的api传输文件

这篇文章主要介绍了使用ajax跨域调用springboot框架的api传输文件&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下在新项目中使用的是springboot编写的api&#xff0c;涉及到ajax跨域请求和传输文件的问题&…

ajax如何设置后台处理进度,让ajax更加友好,实时显示后台处理进度。

ajax应用越来越多&#xff0c;大部分ajax处理都是在前台显示1个"loading...",然后把数据提交给服务器进行处理&#xff0c;处理完毕后显示"处理完毕"。我们能否让ajax更加友好点&#xff0c;实时显示服务器处理的进度了&#xff1f;这在一些长时间的请求中…

element el-checkbox-group 的用法

el-checkbox的lable的用法很关键。 lable对应的是v-model绑定的数组里的对象。 例如&#xff1a;如果lable直接设置为整个item&#xff0c;则v-mode绑定的数组里的对象是整个item。如果lable设置为item的某个值&#xff0c;则v-model绑定的数组里的对象是被绑定的item的某个值…

虚拟服务器可以建数据库集群么,数据库集群写服务器可以有几台吗

数据库集群写服务器可以有几台吗 内容精选换一换GaussDB(DWS) 为用户提供GaussDB(DWS) 管理控制台、GaussDB(DWS) 客户端、REST API等多样化的使用方式。本章节为您介绍GaussDB(DWS) 的主要功能。一个GaussDB(DWS) 集群由多个在相同子网中的相同规格的节点组成&#xff0c;共同…