vue项目如何使页面后退不刷新,且还原滚动条位置

本文主要是介绍vue项目如何使页面后退不刷新,且还原滚动条位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       新指令化管理滚动状态地址https://blog.csdn.net/theoneEmperor/article/details/82669022(欢迎star),滚动条保存以及回退只需要一条指令,让你为所欲为。

        最近学了下node,自己用vue和node弄了个项目。在首页跳到详情页,然后从详情页再跳回来的时候,发现总是要刷新页面,这样对用户操作很不友好,意味着用户不能从上次离开的时候开始浏览,体验极差。我就想能不能回退不刷新,并且记录滚动条的位置,进行复原。

用到keep-alive做缓存的情况

       于是就利用了官网上的keep-alive,把要缓存的页面包裹起来。可能有写界面不需要缓存,那么可以把状态写在路由里面进行控制,例如:

// router.js
{ path: '/register', name: 'register', component: register, meta: { keepAlive: false } },
// App.vue 动画的实现,就交给大家集思广益了
<transition :name="transitionName" mode="out-in"><keep-alive><router-view class="child-view" v-if="$route.meta.keepAlive"></router-view> </keep-alive>
</transition>
<transition :name="transitionName" mode="out-in"><router-view class="child-view" v-if="!$route.meta.keepAlive"></router-view> </transition>

false表示不需要缓存,true表示需要缓存。使用后,发现页面是缓存了,但是滚动条还是个问题。

解决方案:离开之前先把滚动条位置存起来,就是dom的scrollTop,scrollLeft属性,看你的需求来,如果保存有效期只保存到整个vue实例的创建和销毁,也就是app的打开和关闭,可以存进vuex里面,自己写套规则也行。如果向保存久点,丢进localStorage,浏览器数据库等等都行。回来的时候再把它取出来滚动到相应位置就行了。这时候就需要区分滚动条的类型了,分为window全局滚动条和局部滚动条。

created () {this.$nextTick(() => {window.scrollTo(x, y); // 全局滚动条// 局部滚动dom.scrollTop = x;dom.scrollLeft = y;})
}

如果this.$nextTick失效,不能滚动到目标位置,可以试着用setTimeout包裹,不过极大几率会有从0跳动到目标位置一闪的瞬间,解决方案放到下面一起讲。

不用keep-alive

        对于分页加载的列表一定要用keep-alive,或者用我最上面推荐的那个插件里面介绍的写法(ps: 超简便),但是列表页的数据一定要保存起来,回退不能刷新数据,如果是详情页的就没必要保存了,具体看那篇文章吧,这样比keep-alive好点。因为如果你遇到还有tab切换的选项卡型多列表共用一个滚动条现象就比较麻烦了。

       对于一般的不分页的,如果不用keep-alive,也会存在从0到目标位置的闪动,视觉效果极差,可以做一些平滑处理。可以路由切换时加个极短时间的动画,来完美错过这个跳动的时间。还可以加一些请求时的loading动画,效果最好的是加在初始化请求的axios拦截器里(ps:假设你用的是axios),效果非常好。好的动画插件比如:animate.css等,vue的官网上都有推荐。就用到了官网给出的transition。多个页面,直接用多个transition包裹,名字保持一致就好了,具体代码:

 <transition :name="transitionName" mode="out-in"><router-view class="child-view"></router-view>
</transition>

如果是全局滚动条的话,可以往其函数里传入options来平滑过渡,具体如下:

window.scrollTo({top: x,left: y,behavior: 'smooth'
});

到这里,就差不多解决了。无时不在,欢迎讨论。

仓库地址:传送门

演示地址:传送门 (由于我这里只存放在当前实例上,所以刷新浏览器无效,请滑动到一定距离,进详情页,后退,或者直接在详情页查看)

 

这篇关于vue项目如何使页面后退不刷新,且还原滚动条位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856775

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的