瀑布流滾動加載,用于展示長列表,當(dāng)列表即將滾動到底部時,會觸發(fā)事件并加載更多列表項。
通過以下方式來全局注冊組件,更多注冊方式請參考組件注冊。
import { createApp } from 'vue';
import { List } from 'vant';
const app = createApp();
app.use(List);
List 組件通過 ?loading
? 和 ?finished
? 兩個變量控制加載狀態(tài),當(dāng)組件滾動到底部時,會觸發(fā) ?load
? 事件并將 ?loading
? 設(shè)置成 ?true
?。此時可以發(fā)起異步操作并更新數(shù)據(jù),數(shù)據(jù)更新完畢后,將 ?loading
? 設(shè)置成 ?false
? 即可。若數(shù)據(jù)已全部加載完畢,則直接將 ?finished
? 設(shè)置成 ?true
? 即可。
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="沒有更多了"
@load="onLoad"
>
<van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
import { ref } from 'vue';
export default {
setup() {
const list = ref([]);
const loading = ref(false);
const finished = ref(false);
const onLoad = () => {
// 異步更新數(shù)據(jù)
// setTimeout 僅做示例,真實場景中一般為 ajax 請求
setTimeout(() => {
for (let i = 0; i < 10; i++) {
list.value.push(list.value.length + 1);
}
// 加載狀態(tài)結(jié)束
loading.value = false;
// 數(shù)據(jù)全部加載完成
if (list.value.length >= 40) {
finished.value = true;
}
}, 1000);
};
return {
list,
onLoad,
loading,
finished,
};
},
};
若列表數(shù)據(jù)加載失敗,將 ?error
? 設(shè)置成 ?true
? 即可顯示錯誤提示,用戶點擊錯誤提示后會重新觸發(fā) load 事件。
<van-list
v-model:loading="loading"
v-model:error="error"
error-text="請求失敗,點擊重新加載"
@load="onLoad"
>
<van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
import { ref } from 'vue';
export default {
setup() {
const list = ref([]);
const error = ref(false);
const loading = ref(false);
const onLoad = () => {
fetchSomeThing().catch(() => {
error.value = true;
});
};
return {
list,
error,
onLoad,
loading,
};
},
};
List 組件可以與 PullRefresh 組件結(jié)合使用,實現(xiàn)下拉刷新的效果。
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="沒有更多了"
@load="onLoad"
>
<van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
</van-pull-refresh>
import { ref } from 'vue';
export default {
setup() {
const list = ref([]);
const loading = ref(false);
const finished = ref(false);
const refreshing = ref(false);
const onLoad = () => {
setTimeout(() => {
if (refreshing.value) {
list.value = [];
refreshing.value = false;
}
for (let i = 0; i < 10; i++) {
list.value.push(list.value.length + 1);
}
loading.value = false;
if (list.value.length >= 40) {
finished.value = true;
}
}, 1000);
};
const onRefresh = () => {
// 清空列表數(shù)據(jù)
finished.value = false;
// 重新加載數(shù)據(jù)
// 將 loading 設(shè)置為 true,表示處于加載狀態(tài)
loading.value = true;
onLoad();
};
return {
list,
onLoad,
loading,
finished,
onRefresh,
refreshing,
};
},
};
參數(shù) | 說明 | 類型 | 默認值 |
---|---|---|---|
v-model:loading | 是否處于加載狀態(tài),加載過程中不觸發(fā) load 事件 |
boolean | false
|
v-model:error | 是否加載失敗,加載失敗后點擊錯誤提示可以重新觸發(fā) load 事件 |
boolean | false
|
finished | 是否已加載完成,加載完成后不再觸發(fā) load 事件 |
boolean | false
|
offset | 滾動條與底部距離小于 offset 時觸發(fā) load 事件 |
number | string | 300
|
loading-text | 加載過程中的提示文案 | string | 加載中...
|
finished-text | 加載完成后的提示文案 | string | - |
error-text | 加載失敗后的提示文案 | string | - |
immediate-check | 是否在初始化時立即執(zhí)行滾動位置檢查 | boolean | true
|
disabled | 是否禁用滾動加載 | boolean | false
|
direction | 滾動觸發(fā)加載的方向,可選值為 up
|
string | down
|
事件名 | 說明 | 回調(diào)參數(shù) |
---|---|---|
load | 滾動條與底部距離小于 offset 時觸發(fā) | - |
通過 ref 可以獲取到 List 實例并調(diào)用實例方法,詳見組件實例方法。
方法名 | 說明 | 參數(shù) | 返回值 |
---|---|---|---|
check | 檢查當(dāng)前的滾動位置,若已滾動至底部,則會觸發(fā) load 事件 | - | - |
組件導(dǎo)出以下類型定義:
import type { ListProps, ListInstance, ListDirection } from 'vant';
ListInstance 是組件實例的類型,用法如下:
import { ref } from 'vue';
import type { ListInstance } from 'vant';
const listRef = ref<ListInstance>();
listRef.value?.check();
名稱 | 說明 |
---|---|
default | 列表內(nèi)容 |
loading | 自定義底部加載中提示 |
finished | 自定義加載完成后的提示文案 |
error | 自定義加載失敗后的提示文案 |
組件提供了下列 CSS 變量,可用于自定義樣式,使用方法請參考 ConfigProvider 組件。
名稱 | 默認值 | 描述 |
---|---|---|
--van-list-text-color | var(--van-text-color-2) | - |
--van-list-text-font-size | var(--van-font-size-md) | - |
--van-list-text-line-height | 50px | - |
--van-list-loading-icon-size | 16px | - |
List 會監(jiān)聽瀏覽器的滾動事件并計算列表的位置,當(dāng)列表底部與可視區(qū)域的距離小于 ?offset
? 時,List 會觸發(fā)一次 ?load
? 事件。
List 初始化后會觸發(fā)一次 load 事件,用于加載第一屏的數(shù)據(jù),這個特性可以通過 ?immediate-check
? 屬性關(guān)閉。
如果一次請求加載的數(shù)據(jù)條數(shù)較少,導(dǎo)致列表內(nèi)容無法鋪滿當(dāng)前屏幕,List 會繼續(xù)觸發(fā) ?load
? 事件,直到內(nèi)容鋪滿屏幕或數(shù)據(jù)全部加載完成。
因此你需要調(diào)整每次獲取的數(shù)據(jù)條數(shù),理想情況下每次請求獲取的數(shù)據(jù)條數(shù)應(yīng)能夠填滿一屏高度。
?List
? 有以下三種狀態(tài),理解這些狀態(tài)有助于你正確地使用 ?List
? 組件:
loading
? 為 ?false
?,此時會根據(jù)列表滾動位置判斷是否觸發(fā) ?load
? 事件(列表內(nèi)容不足一屏幕時,會直接觸發(fā))。loading
? 為 ?true
?,表示正在發(fā)送異步請求,此時不會觸發(fā) ?load
? 事件。finished
? 為 ?true
?,此時不會觸發(fā) ?load
? 事件。在每次請求完畢后,需要手動將 ?loading
? 設(shè)置為 ?false
?,表示加載結(jié)束。
若 List 的內(nèi)容使用了 float 布局,可以在容器上添加 ?van-clearfix
? 類名來清除浮動,使得 List 能正確判斷元素位置。
<van-list>
<div class="van-clearfix">
<div class="float-item" />
<div class="float-item" />
<div class="float-item" />
</div>
</van-list>
如果在 html 和 body 標(biāo)簽上設(shè)置了 ?overflow-x: hidden
? 樣式,會導(dǎo)致 List 一直觸發(fā)加載。
html,
body {
overflow-x: hidden;
}
這個問題的原因是當(dāng)元素設(shè)置了 ?overflow-x: hidden
? 樣式時,該元素的 ?overflow-y
? 會被瀏覽器設(shè)置為 ?auto
?,而不是默認值 ?visible
?,導(dǎo)致 List 無法正確地判斷滾動容器。解決方法是去除該樣式,或者在 html 和 body 標(biāo)簽上添加 ?height: 100%
? 樣式。
設(shè)置 ?direction
? 屬性為 up 后,當(dāng)滾動條處于頁面頂部時,就會觸發(fā) List 組件的加載。
因此在使用該屬性時,建議在每次數(shù)據(jù)加載完成后,將滾動條滾動至頁面底部或非頂部的位置。
更多建議: