van-list中数据加载先后顺序,你真的搞明白了吗?

445 阅读3分钟

van-list中数据加载先后顺序,你真的搞明白了吗?

前言

目前在做一个使用vant组件库开发的H5的项目,在一个数据列表页时用到了van-list组件,在数据较少的时候(数据没有达到自己设定的pageSize的最大限制),项目还是正常在运行;但是当数据超过了每页限制的最大字数,数据加载的顺序并没有按照既定的要求去加载数据,我第一时间去看了van-list组件的API,但是并没有得到答案

###

问题描述

当页面中间存在多个tab的时候,在多个tab之间来回切换的时候,当从甲tab切换到乙tab的时候,会调用两次接口,可能就会导致第二页的数据比第一页加载完成的要早,并且直接渲染到了页面上,导致concat合并两次数据展示的时候,数据展示的先后数据就可能会发生混乱

###

出现的原因

因为触发了created钩子还触发了van-list的onLoad事件,在进入到created钩子的时候就调用了一次接口,且调用的位置在.then({})之前,而此时异步回调的参数还没有返回回来,又会去触发onLoad事件,导致直接加载了两页的数据。

#

先了解一下van-list组件身上一些比较重要的API

### 1.基础用法

list组件控制加载状态是通过loading和finished来完成的,当组件滚动到底部的时候,会触发load事件,并将loading设置为true,并去异步的加载数据。数据请求回来之后,再将loading设置为true即可。若所有的数据都加载完毕了,直接将finished设置为true就好了。

### 2.List 的运行机制是什么?

List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List会触发一次 load 事件。

### 3.为什么 List 初始化后会立即触发 load 事件?

List 初始化后会触发一次 load事件,用于加载第一屏的数据,这个特性可以通过immediate-check属性关闭。

### 4.为什么会连续触发 load 事件?

如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。

#### 5.loading 和 finished 分别是什么含义?

**List有以下三种状态,理解这些状态有助于你正确地使用List组件:

非加载中,loading为false,此时会根据列表滚动位置判断是否触发onload事件(列表内容不足一屏幕时,会直接触发)

加载中,loading为true,表示正在发送异步请求,此时不会触发onload事件

加载完成,finished为true,此时不会触发onload事件 在每次请求完毕后,需要手动将loading设置为false,表示加载结束**

## 解决方案

这次遇到的问题,可以利用第五点,解决方法:

在进入created的发送请求之前,将this.loading = true , ⇒⇒⇒ (利用:加载中,loading为true,表示正在发送异步请求,此时不会触发load事件),让系统知道此时正在异步请求数据,让它别触发onload事件