Vue切换路由,页面回到上一次缓存的滚动位置(代码量少,通用有效)

需求:

当切换不同路由时,期望切换后的路由页面保留上次滚动的位置。

解决思路:

利用路由中的meta属性,对不同路由页面滚动的位置做缓存,切换路由时,获取当前路由meta属性中缓存的滚动位置,再自动滚动到此位置即可。

具体代码:

router.js文件

		<!-- 操作一 -->
		// 在meta属性中增加scrollTop属性
		{
        path: 'goodList',
        name: 'goodList',
        meta: {
          title: '商品列表',
          scrollTop: 0
        },
        component: resolve => require(['@/pages/goodList/index.vue'], resolve)
      },

layout.vue文件

		<!-- 操作二 -->
		// 在指定内容页视图元素中,添加ref属性及mousewheel事件
        <div ref="scrollView" @mousewheel="scrollChange">
          <keep-alive>
            <router-view v-if="!needRelogin" :key="$route.fullPath" ref="pageView"></router-view>
          </keep-alive>
        </div>
        
		<!-- 操作三 -->
        // methods中定义滚动监听事件,设置路由meta属性里面的指定参数
	    scrollChange(e) {
	      console.log('父滚动条到页面顶部距离', e.target.offsetTop)
	      console.log('相对距离', this.$refs.scrollView.scrollTop)
	      console.log('绝对距离', e.target.offsetTop + this.$refs.scrollView.scrollTop)
	      // 设置路由参数scrollTop等于当前元素的相对距离
	      this.$route.meta.scrollTop = this.$refs.scrollView.scrollTop
	    }
	
		<!-- 操作四 -->
	    // monted中给元素添加滚动监听
		mounted() {
		    // 获取指定元素
		    const scrollView = this.$refs['scrollView']
		    // 添加滚动监听
		    scrollView.addEventListener('scroll', this.scrollChange, true)
		},

		<!-- 操作五 -->
		// 销毁监听
		 beforeDestroy() {
		    // 获取指定元素
		    const scrollView = this.$refs['scrollView']
		    // 移除监听
		    scrollView.removeEventListener('scroll', this.scrollChange, true)
		 },

		<!-- 操作六 -->
		// 监听路由变化时,自动滚动到上次缓存的位置
		 watch: {
		    '$route.path': {
		      handler: () => {
		        // 自动滚动到上一次缓存位置
		        this.$nextTick(() => {
		          this.$refs.scrollView.scrollTo(0, this.$route.meta?.scrollTop || 0)
		        })
		      },
		      // 深度观察监听
		      deep: true
		    }
		 },

备注: 以上就是所有代码啦,本文所提供的方法可适用于所有vue工程项目,可解决vue-router 所提供方法 scrollBehavior 和 keepAlive不生效等问题。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面我来详细介绍一下如何在Vue中清除上一个页面的CSS: 1. 使用Vue的过渡效果(transition)功能 在Vue中,可以使用过渡效果(transition)来实现页面切换的动画效果。在过渡效果中,可以设置在页面切换前后需要添加或删除的CSS类,从而达到清除上一个页面CSS的效果。具体实现步骤如下: (1)在路由组件的模板(template)中添加过渡效果的代码,例如: ```html <transition name="fade"> <router-view></router-view> </transition> ``` (2)在路由组件的样式表(style)中定义过渡效果的CSS类,例如: ```css .fade-enter-active, .fade-leave-active { transition: opacity .5s; } .fade-enter, .fade-leave-to { opacity: 0; } ``` (3)在路由组件的JavaScript代码中,设置过渡效果的名称(name)和模式(mode),例如: ```javascript export default { name: 'MyComponent', transition: { name: 'fade', mode: 'out-in' } } ``` 2. 在路由组件中手动清除上一个页面的CSS 在路由组件的生命周期钩子函数中,可以使用JavaScript代码来手动删除上一个页面的CSS。具体实现步骤如下: (1)在路由组件的JavaScript代码中,定义一个生命周期钩子函数beforeDestroy,例如: ```javascript export default { name: 'MyComponent', beforeDestroy() { // 在此处清除上一个页面的CSS } } ``` (2)在beforeDestroy函数中,使用JavaScript原生代码或者第三方CSS库来删除上一个页面的CSS。例如,使用原生代码删除所有样式表: ```javascript beforeDestroy() { const styles = document.querySelectorAll('style'); for (let i = 0; i < styles.length; i++) { styles[i].parentNode.removeChild(styles[i]); } } ``` 或者使用第三方CSS库,例如:reset.css或normalize.css等来清除样式表。 以上就是在Vue中清除上一个页面CSS的两种方法。具体实现方式可以根据实际情况选择。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值