vue keepAlive实现列表页面缓存

需求

订单列表,点击去详情页,再返回列表,要保持上次滑动的位置。且详情页面可以进行增删改查操作,返回列表要使当前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 & bodybody不能
html或bodydocument, 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页签每次切换也会保存滚动条状态。需要切换页面后,加载数据前,清空列表数据源。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值