Files
nuxt__ui/docs/app/components/content/examples/select/SelectInfiniteScrollExample.vue

62 lines
1.1 KiB
Vue

<script setup lang="ts">
import { useInfiniteScroll } from '@vueuse/core'
type User = {
firstName: string
}
type UserResponse = {
users: User[]
total: number
skip: number
limit: number
}
const skip = ref(0)
const { data, status, execute } = await useLazyFetch('https://dummyjson.com/users?limit=10&select=firstName', {
key: 'select-users-infinite-scroll',
params: { skip },
transform: (data?: UserResponse) => {
return data?.users.map(user => user.firstName)
},
immediate: false
})
const users = ref<string[]>([])
watch(data, () => {
users.value = [
...users.value,
...(data.value || [])
]
})
function onOpen() {
if (!users.value?.length) {
execute()
}
}
const select = useTemplateRef('select')
onMounted(() => {
useInfiniteScroll(() => select.value?.viewportRef, () => {
skip.value += 10
}, {
canLoadMore: () => {
return status.value !== 'pending'
}
})
})
</script>
<template>
<USelect
ref="select"
placeholder="Select user"
:items="users"
@update:open="onOpen"
/>
</template>