Vue切换路由,页面回到上一次缓存的滚动位置(代码量少,通用有效)
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/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不生效等问题。
GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
更多推荐
已为社区贡献5条内容
所有评论(0)