|
|
@@ -5,7 +5,9 @@
|
|
|
vipHomePage: $route.path === '/member',
|
|
|
isScroll: appStore.isScroll,
|
|
|
}"
|
|
|
- v-infinite-scroll="scrollLoad" infinite-scroll-disabled="false" infinite-scroll-distance="0"
|
|
|
+ v-infinite-scroll="scrollLoad"
|
|
|
+ :infinite-scroll-disabled="infiniteDisabled"
|
|
|
+ infinite-scroll-distance="0"
|
|
|
:infinite-scroll-immediate="false"
|
|
|
>
|
|
|
<ElConfigProvider :locale="langStore.elLocale">
|
|
|
@@ -196,15 +198,37 @@ provide('openLoginDialog', openLoginDialog);
|
|
|
|
|
|
// 无限滚动加载
|
|
|
const routerChildRef = ref(null);
|
|
|
+// 是否在加载中,防止多次触发 loadMore
|
|
|
+const isLoadingMore = ref(false);
|
|
|
+// 当前路由是否需要开启无限滚动(比如只有列表页开启)
|
|
|
+const isInfiniteScrollPage = computed(() => {
|
|
|
+ // 按需添加需要无限滚动的路由前缀
|
|
|
+ if (route.path.startsWith('/index')) return true;
|
|
|
+ if (route.path.startsWith('/learning-system')) return true;
|
|
|
+ if (route.path.startsWith('/learn-note')) return true;
|
|
|
+ if (route.path.startsWith('/workflow-trade')) return true;
|
|
|
+ return false;
|
|
|
+});
|
|
|
+// 控制 v-infinite-scroll 的禁用状态
|
|
|
+const infiniteDisabled = computed(() => {
|
|
|
+ return !isInfiniteScrollPage.value || isLoadingMore.value;
|
|
|
+});
|
|
|
+
|
|
|
const scrollLoad = () => {
|
|
|
- console.log('触发滚动加载',routerChildRef.value)
|
|
|
- nextTick(() => {
|
|
|
- const routerChild = routerChildRef.value;
|
|
|
-
|
|
|
- if (routerChild && typeof routerChild.loadMore === 'function') {
|
|
|
- routerChild.loadMore();
|
|
|
- }
|
|
|
- });
|
|
|
+ if (infiniteDisabled.value) return;
|
|
|
+ const routerChild = routerChildRef.value;
|
|
|
+ if (!routerChild || typeof routerChild.loadMore !== 'function') return;
|
|
|
+
|
|
|
+ isLoadingMore.value = true;
|
|
|
+ // 兼容 loadMore 返回 Promise 或同步函数两种情况
|
|
|
+ const res = routerChild.loadMore();
|
|
|
+ if (res && typeof res.then === 'function') {
|
|
|
+ res.finally(() => {
|
|
|
+ isLoadingMore.value = false;
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ isLoadingMore.value = false;
|
|
|
+ }
|
|
|
};
|
|
|
</script>
|
|
|
|