mirror of
https://github.com/nuxt/ui.git
synced 2026-09-14 19:51:10 +08:00
62 lines
1.1 KiB
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>
|