移动端多tabs列表分页方案

341 阅读2分钟

uni-app开发小程序中不支持使用keep-alive,所以要使用v-show+v-if模拟来模拟v-show的效果(为什么要这样用,是因为之前tab中加载过的分页数据希望缓存下来,不希望又去加载一遍),所有便有了如下一些问题待解决

1.如何把每个tabs列表中分页的数据保存下来,答案(建立一个响应式的数组对象,将当前页,每页数量,是否加载完毕,是否已经渲染过等,list等数据存起来)

2.具体是如何模拟keep-alive功能的,使用v-for循环响应式数组对象,并且在这个标签上加上v-show去控制当前列表的显示隐藏(做缓存),然后在子标签中放置当前列表组件(使用v-if),保证第一次加载走请求

3.技巧将当前的配置对象使用计算属性计算,还有注意当前tabs类型的列表中是否有还有下一页,如果没有的话,向下滚动变不再需要加载第一页(减少无用请求),注意一点你希望保持 scrollTop 的值在切换 tabs 时不变,你可能需要采取一些额外的措施,因为 Vue 的响应式系统不会自动跟踪和恢复 scrollTop 的值。以下是一些可能的解决方案:scrollTop不会被保存,也需要存在上面响应式响应式数组对象上

  // 当前的tab配置对象
  const feedTab = computed(() => feedTabs.value[tabIndex.value])

何时去更改当前tabs的标签页

async function onFeedTabChange({ index }) {
		tabIndex.value = index

		// 如果当前 tab 配置中的 rendered 为 false,那么就需要发一次请求
		if (!feedTab.value.rendered) {
			loadList()
		}

		// 只要点击过这个tab,就将其 是否渲染过 标记为 true
		feedTab.value.rendered = true

		await nextTick()
		curScrollTop.value = feedTab.value.scrollTop
	}

简易版本

image.png