<template> <div ref="scroller" class="tw-relative -tw-m-4 tw-pb-8 tw-overflow-x-visible tw-overflow-y-scroll tw-overscroll-contain" > <ol class="tw-m-0 tw-p-4" v-bind="attrs"> <slot /> </ol> <div v-if="isLoading" class="tw-absolute tw-bottom-0 tw-left-1/2 -tw-translate-x-1/2 tw-inline-flex tw-justify-center tw-text-blue-300" > <Loading class="tw-h-2" /> </div> </div> </template> <script lang="ts" setup> import { useInfiniteScroll } from '@vueuse/core' import { ref, useAttrs } from 'vue' import Loading from './Loading.vue' const props = defineProps<{ loadMore: () => void | Promise<void> }>() const attrs = useAttrs() const scroller = ref<HTMLOListElement>() const isLoading = ref(false) async function loadMoreData() { isLoading.value = true try { await props.loadMore() } finally { isLoading.value = false } } loadMoreData() useInfiniteScroll(scroller, loadMoreData) </script> <script lang="ts"> export default { inheritAttrs: false, compatConfig: { MODE: 3, }, } </script>