欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue keepAlive实现列表页面缓存

程序员文章站 2022-03-04 17:37:16
...

需求

订单列表,点击去详情页,再返回列表,要保持上次滑动的位置。且详情页面可以进行增删改查操作,返回列表要使当前tab下的列表状态为最新。

基本html结构

<div id="#app">
	<div class="wraper">
		<div class="inner">
			<div v-for="item in list" :key="item.id">{{item}}</div>
		</div>
	</div>
</div>

实现思路(3步完成基本功能)

  • vue提供了keep-alive组件,套在<router-view v-if="$route.meta.keepAlive">外层
  • 列表页路由配置: meta: {keepAlive: true}
  • 页面样式修改,要让文档能滚动。之前项目发现不能保持滚动条,就是因为设置了元素.wraper为绝对定位。
    !这个keep-alive组件必须要让文档document滚动,才有效果。注意设置overflow: auto,不能html, body同时设置
设置overflow: auto的元素 滚动条属于 能否保存滚动位置
html & body body 不能
html或body document, window
!html & !body(都不设置) document, window

自定义上拉加载(监听滚动条事件)

  • 定义三个变量:viewHeight(窗口高度), itemListHeight(元素撑起来的高度), scrollHeight(文档滚动出去距离顶部的高度)
  • itemListHeight - viewHeight - scrollHeight < 20 加载新一页
  • 文档距离顶部滚动距离兼容写法:
    // document.compatMode: 'BackCompat' 混杂模式/怪异模式 | 'CSS1Compat' 标准模式
    // window.pageYOffset 是 window.scrollY  的别称。旧版本IE(<9)两个属性都不支持
    
    var supportPageOffset = window.pageXOffset !== undefined;
    var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
    
    var x = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
    var y = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
    

列表及时刷新且保存滚动条位置处理

  • 存储点击的该订单对象obj1和下标index1
  • 如果详情做了增删改查等操作,都会重新请求一次订单详情接口,得到新的订单详情对象。用路由守卫,beforeRouteLeave方法中,存储订单详情对象obj2
  • 返回列表activated,判断obj1和obj2订单编号一致,相同订单关键值如订单状态是否一致,如果不一致,则分情况:全部tab下,修改该订单为新状态,其他状态tab下,删除该订单
  • 如果订单详情操作的订单关联列表中不定量个其他订单。则一返回列表,应该刷新当前tab,且要请求size为 ( parseInt(index1/10) + 1 ) * 10条,我这里分页是默认一页十条,多刷新出10条是考虑当前点击的刚好index1某一页的末尾一条,同时后一页也加载并展示在页面了。下拉刷新时候保持size为同一个size。切换为其他tab时,可以重置size为10。

需要注意的问题

  • 如果列表和详情,有监听同一个vuex值的watcher, 需要改,因为列表缓存了之后,详情里watcher不会生效。
  • 列表tab页签每次切换也会保存滚动条状态。需要切换页面后,加载数据前,清空列表数据源。
相关标签: vue 项目优化