vue中记录页面的滚动距离
业务需求:pageOne页面是一个商品列表页面,在这个页面点击商品,就会跳转到pageTwo商品详细页面。此时再从pageTwo页面返回到pageOne页面时,pageOne页面需要做到:1.记录pageOne之前的滚动的距离。2.不重新请求数据。而从其它页面进入到pageOne页面时,pageOne页面不需要记录之前的滚动距离和需要重新请求数据。
1.使用keep-alive组件的实现方法
App.vue
<template>
<div id="app">
<div id="nav">
<router-link to="/other">other</router-link> |
<router-link to="/page-one">page-one</router-link> |
<router-link to="/page-two">page-two</router-link>
</div>
<div class="container">
<!-- 使用keep-alive是为了缓存page-one组件内部scroll的值 -->
<keep-alive>
<router-view/>
</keep-alive>
</div>
</div>
</template>
page-one.vue
<template>
<div class="page-one" ref="pageOneContainer">
<p v-for="item in 20" :key="item">测试</p>
</div>
</template>
<script>
export default {
name: '',
data () {
return {
scroll: 0
}
},
beforeRouteEnter (to, from, next) {
if (from.name === 'pageTwo') {
next(vm => {
const pageOneContainer = vm.$refs.pageOneContainer
// 记录滚动高度
pageOneContainer.scrollTop = vm.scroll
// 不重新请求数据
vm.notFetchData()
})
} else {
next(vm => {
const pageOneContainer = vm.$refs.pageOneContainer
// 不记录滚动高度
pageOneContainer.scrollTop = 0
// 重新请求数据
vm.fetchData()
})
}
},
beforeRouteLeave (to, from, next) {
if (to.name === 'pageTwo') {
const pageOneContainer = this.$refs.pageOneContainer
this.scroll = pageOneContainer.scrollTop
}
next()
},
methods: {
fetchData () {
console.log('need flash')
},
notFetchData () {
console.log('do not need flash')
}
}
}
</script>
<style scoped>
.page-one {
height: 100px;
background-color: #ccc;
overflow: auto;
}
</style>
2.不使用keep-alive组件的实现方法
App.vue
<template>
<div id="app">
<div id="nav">
<router-link to="/other">other</router-link> |
<router-link to="/page-one">page-one</router-link> |
<router-link to="/page-two">page-two</router-link>
</div>
<div class="container">
<router-view/>
</div>
</div>
</template>
page-one.vue
<template>
<div class="page-one" ref="pageOneContainer">
<p v-for="item in 20" :key="item">测试</p>
</div>
</template>
<script>
export default {
name: '',
beforeRouteEnter (to, from, next) {
if (from.name === 'pageTwo') {
next(vm => {
const pageOneContainer = vm.$refs.pageOneContainer
// 记录滚动高度
pageOneContainer.scrollTop = vm.$route.meta.scroll || 0 // 从page-one路由的meta属性中获取scroll
// 不重新请求数据
vm.notFetchData()
})
} else {
next(vm => {
const pageOneContainer = vm.$refs.pageOneContainer
// 不记录滚动高度
pageOneContainer.scrollTop = 0
// 重新请求数据
vm.fetchData()
})
}
},
beforeRouteLeave (to, from, next) {
if (to.name === 'pageTwo') {
const pageOneContainer = this.$refs.pageOneContainer
// 将page-one页面的scroll记录到路由的meta中
this.$route.meta.scroll = pageOneContainer.scrollTop
}
next()
},
methods: {
fetchData () {
console.log('need flash')
},
notFetchData () {
console.log('do not need flash')
}
}
}
</script>
<style scoped>
.page-one {
height: 100px;
background-color: #ccc;
overflow: auto;
}
</style>
效果展示:

使用keep-alive缓存组件只是为了保存page-one组件中的scroll属性,若不想缓存组件,可以有很多钟方法来记录scroll,例如上面使用的路由元信息meta、vuex、cookie、sessionStorage、localStorage等都能实现同样的效果。
vue中记录页面的滚动距离的更多相关文章
- vue中判断页面滚动开始和结束
参考链接:https://www.jianshu.com/p/adad39705ced 和 https://blog.csdn.net/weixin_44309374/article/deta ...
- vue中给window添加滚动监听无效的解决方案
原文链接: 点我 页面中有这么一个需求,当页面滚动到一定高度之后,页面中的某些元素进行吸顶,固定到顶部位置,或者是滚动到一定程度进行更新数据的操作.我相信不少网友查阅过类似的资料,网友给出的解决方案, ...
- vue中的页面渲染方案
一.模板渲染 <div id="J_render_app"> <ul v-if="items.length"> <li v-for ...
- vue中嵌套页面 iframe 标签
vue中嵌套iframe,将要嵌套的文件放在static下面: <iframe src="../../../static/bear.html" width="300 ...
- vue中嵌套页面(iframe)
vue中嵌套iframe,将要嵌套的文件放在static下面.(要将打包文件整体放在statici里,我的文件名是canvas) src可以使用相对路径,也可使用服务器根路径http:localhos ...
- vue中在页面渲染完之后获取元素(否则动态渲染的元素获取不到)
两种方法: 方法一: 使用$nextTick,在异步获得数据之后再获取元素: 方法二: 在then之后再获取该元素: 问题2:vue中监听改变数组的方法: let idx =; this.listIn ...
- js微信禁用右上角的分享按钮,和vue中微信页面禁用右上角的分享按钮的问题
1.隐藏微信网页右上角的按钮 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { // 通过下面这个 ...
- vue中html页面写入$t(‘’)怎么显示
1.在 main.js 中引入 vue-i18n (前提是要先引入 vue) 1 2 import VueI18n from'vue-i18n' Vue.use(VueI18n) 2.准备本地的翻译信 ...
- vue中渲染页面,动态设置颜色
for循环中动态设置页面的图标或者字体颜色与循环中且套循环 :style="{'color':items.color}" 案例代码: html中 <div class=&qu ...
随机推荐
- linux下vnstat查看服务器带宽流量统计
因为很多vps或者服务器都是限流量的,但是又很多服务商并没有提供详细的流量表,比如每天的流量表,所以肯定有人很想知道自己服务器到底跑了多少流量. vnstat就是一个很好用的服务器流量统计命令.我 ...
- CF914D
CF914D 用线段树乱搞一下就行qwq #include<iostream> #include<cstring> #include<cstdio> #includ ...
- bootstrap学习(四)表格
基础样式: 自适应沾满浏览器 <table class="table"> <tr> <th>序号</th> <th>姓名 ...
- go 学习Printf
package main import "fmt" import "os" type point struct { x, y int } func main() ...
- UltraEdit常用快捷键
UltraEdit是一套功能强大的文本编辑器,可以编辑文本.十六进制.ASCII码,可以取代记事本,内建英文单字检查.C++及VB指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢. 说 ...
- 2018-2-13-win10-uwp-hashcash
title author date CreateTime categories win10 uwp hashcash lindexi 2018-2-13 17:23:3 +0800 2018-2-13 ...
- Git版本控制及gitlab私有仓库
Git版本控制系统 版本控制系统简介 版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本内容情况的系统 记录文件的所有历史变化 随时恢复到任何一个历史状态 多人协作开发 常见版本管理 ...
- 群晖NAS被攻击
上周给新员工办理入职的时候,因为我们有自己的NAS系统,给他们建账号的时候,突然发现群晖无法登陆,很奇怪. 然后查看群晖系统,发现网络能Ping 通,但是群晖管理界面无法打开,一开始以为机房天热,硬盘 ...
- Gym 102007I 二分 网络流
题意:给你一张图,每个城市有一些人,有不超过10个城市有避难所,避难所有容量上限,问最快多久可以让所有人进入避难所? 思路:二分时间,对于每个时间跑一遍最大流,判断最大流是不是人数即可.我们还需要用二 ...
- HBase之BlockCache数据读取(转)
转自:http://blog.csdn.net/u014297175/article/details/47976909 Hbase上Regionserver的内存分为两个部分,一部分作为Memstor ...