mirror of
https://github.com/tenrok/vue-select.git
synced 2026-06-19 09:50:33 +03:00
223f3a6d85
commit8c3a1b107bAuthor: Jeff Sagal <sagalbot@gmail.com> Date: Fri Jul 15 09:57:37 2022 -0700 bump to vitepress 1.0.0-alpha.4 commit96ff08406cAuthor: Jeff Sagal <sagalbot@gmail.com> Date: Wed Feb 23 10:25:36 2022 -0800 vitepress wip mostly working, feeling like vuepress should still be considered commitf3e22e0439Author: Jeff Sagal <sagalbot@gmail.com> Date: Sat Feb 19 17:18:30 2022 -0800 remove yarn, rename readme commit8cd3bbeb51Author: Jeff Sagal <sagalbot@gmail.com> Date: Sat Feb 19 17:17:22 2022 -0800 install vitepress
76 lines
1.7 KiB
Vue
76 lines
1.7 KiB
Vue
<template>
|
|
<v-select
|
|
:options="paginated"
|
|
:filterable="false"
|
|
@open="onOpen"
|
|
@close="onClose"
|
|
@search="(query) => (search = query)"
|
|
>
|
|
<template #list-footer>
|
|
<li v-show="hasNextPage" ref="load" class="loader">
|
|
Loading more options...
|
|
</li>
|
|
</template>
|
|
</v-select>
|
|
</template>
|
|
|
|
<script>
|
|
import vSelect from 'vue-select'
|
|
import countries from '../data/countries'
|
|
|
|
export default {
|
|
name: 'InfiniteScroll',
|
|
data: () => ({
|
|
observer: null,
|
|
limit: 10,
|
|
search: '',
|
|
}),
|
|
computed: {
|
|
filtered() {
|
|
return countries.filter((country) => country.includes(this.search))
|
|
},
|
|
paginated() {
|
|
return this.filtered.slice(0, this.limit)
|
|
},
|
|
hasNextPage() {
|
|
return this.paginated.length < this.filtered.length
|
|
},
|
|
},
|
|
mounted() {
|
|
/**
|
|
* You could do this directly in data(), but since these docs
|
|
* are server side rendered, IntersectionObserver doesn't exist
|
|
* in that environment, so we need to do it in mounted() instead.
|
|
*/
|
|
this.observer = new IntersectionObserver(this.infiniteScroll)
|
|
},
|
|
methods: {
|
|
async onOpen() {
|
|
if (this.hasNextPage) {
|
|
await this.$nextTick()
|
|
this.observer.observe(this.$refs.load)
|
|
}
|
|
},
|
|
onClose() {
|
|
this.observer.disconnect()
|
|
},
|
|
async infiniteScroll([{ isIntersecting, target }]) {
|
|
if (isIntersecting) {
|
|
const ul = target.offsetParent
|
|
const scrollTop = target.offsetParent.scrollTop
|
|
this.limit += 10
|
|
await this.$nextTick()
|
|
ul.scrollTop = scrollTop
|
|
}
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.loader {
|
|
text-align: center;
|
|
color: #bbbbbb;
|
|
}
|
|
</style>
|