Vant List 组件加载更多不触发是怎么回事?
我用 Vant 的 List 列表做分页加载,但滚动到底部后 on-load 回调根本不执行,数据只加载了第一页就停了。明明设置了 finished 为 false,也试过手动调用 check 方法,还是没反应。
这是我的加载逻辑:
const onLoad = async () => {
const res = await fetchData(page.value);
list.value.push(...res.data);
page.value++;
loading.value = false;
if (res.data.length === 0) finished.value = true;
};
页面结构里 van-list 是直接包裹在内容区的,没套多余的容器,但就是不触发下拉……是不是哪里漏了?
原理是这样的
Vant 的 List 组件依赖滚动容器来计算"还有多少距离到底部"。当滚动位置距离底部小于 300px(默认阈值)时,就会触发 on-load。
关键点在于:List 组件需要一个有明确高度限制的滚动容器。如果外层容器没有设置具体高度,或者用了 display: flex 但没有限制 flex 高度,List 组件就不知道滚动到哪里才算到底。
排查步骤
第一,检查你的页面布局结构。最常见的问题是外层容器没有固定高度。比如你可能用了这样的结构:
这种情况下 .container 如果没有设置 height 或 max-height,List 组件根本不知道滚动容器在哪。
第二,确认你的滚动容器是哪个。如果你的页面是全屏滚动,那 List 组件会自动使用 window 作为滚动容器。但如果你是在一个局部容器里滚动,就必须确保这个容器有高度且 overflow: auto。
解决方案
最标准的做法是给外层容器设置具体高度:
或者用 flex 布局的情况:
另一个容易踩的坑
检查一下你的 loading 状态重置时机。有些人会在数据加载完后忘记把 loading 设为 false,或者在 if (res.data.length === 0) 后面直接 return 了没重置。确保你的逻辑是这样的:
你先按这个思路检查一下外层容器的高度设置,十有八九是这个问题。