Skip to content
Snippets Groups Projects
Browser.vue 1.05 KiB
Newer Older
  • Learn to ignore specific revisions
  • <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>