在使用vant List列表组件开发时,遇到一个坑就是接口重复加载,导致这个bug的原因是, 滚动到底部时会自动触发onload,在切换条件时,重置数据为空后也会触发滚动onload事件。因为数据是异步请求回来的,在第一次触发onload后,数据还在路上时,再时触发onlad导致2次ajax请求。
主要需要注意以下几点
是否正确设置this.loading=false;。 (因为每次加载函数执行的时候,this.loading 会自动变为 true, 如果不设置为 false 则不会继续加载)。
需要给van-list增加 :immediate-check=“false” 属性,不要让他首次加载,然后在 created() {} 里面进行首次加载(这样可以放置首次加载出现多次加载的情况)
异步获取到数据后,需要给在元数据的基础上增加数据,可以参考后面的例子代码,注意,要使用 setTimeout(() => {} 并且一定要在 for 循环后立马使用 this.new_loading = false; (这样就不会出现多次加载的情况了)
同页面多个下拉加载的问题,可以针对 加载(loading),完成(finished),页数(page),数据(data_list),加载函数(onLoad) 这五个参数进行多重设置,也就是说,让每一个 vant-list 对应一组 加载(loading),完成(finished),页数(page),数据(data_list),加载函数(onLoad) 这五个参数,然后更新的时候分开更新就行。(我就不写这部分代码了)
数据加载完成后,要使用 this.finished = true; 。(这样可以防止没有数据了,还在继续做异步请求)
参考代码如下:
// 这部分是 van-lit 的代码
<van-list v-model="new_loading"
:finished="new_finished"
finished-text="没有更多了"
:immediate-check="false"
@load="onLoadNew">
<ul class="goods_list_box van-clearfix">
<li v-for="item in new_goods"
:key="item.id">
// 这里面是内容列表的代码
</li>
</ul>
</van-list>
<##script>
// 这里面是script的部分代码,注意:不是全部代码
data() {
return {
new_goods: [], // 新商品列表
new_loading: false, // 新商品商品加载中
new_finished: false, // 新商品加载完成
new_page: 1, // 新商品当前页数
};
},
created() {
// 首次加载数据
this.loadGoods("new", 1, 10, "refresh");
},
methods: {
// 加载新商品
onLoadNew() {
// 数量加一
this.new_page += 1;
// 增加商品
this.loadGoods("new", this.new_page, 10, "add");
},
// 添加或者刷新商品(刷新商品和第一次加载商品是一样的)
// loadGoods(类型(这个不用管),页数,每页个数,状态(刷新还是增加))
async loadGoods(type, page, page_num, status) {
// 异步获取数据
let result = await index_goods_list(type, page, page_num);
// 刷新商品(首次加载商品)
if (status == "refresh") {
this.new_goods = result.new_goods;
} else if (status == "add") {
// 这里是增加数据
if (result.new_goods.length == 0) {
// 没有数据的话,加载完成
this.new_finished = true;
} else {
// 这里一定要用 setTimeout(() => {} 来增加数据
setTimeout(() => {
result.new_goods.forEach((element) => {
this.new_goods.push(element);
});
// 注意,for循环完成后,一定要立马 this.new_loading = false;
this.new_loading = false;
}, 1000);
}
}
},
}
##script>