3.8.0+

Pagination is supported using slots available with Vue Select 3.8 and above.

Pagination can be a super helpful tool when working with large sets of data. If you have 1,000 options, the component is going to render 1,000 DOM nodes. That's a lot of nodes to insert/remove, and chances are your user is only interested in a few of them anyways.

To implement pagination with Vue Select, you can take advantage of the list-footer slot. It appears below all other options in the drop down list.

To make pagination work properly with filtering, you'll have to handle it yourself in the parent. You can use the filterable boolean to turn off Vue Select's filtering, and then hook into the search event to use the current search query in the parent component.

<template>
  <v-select :options="paginated" @search="query => search = query" :filterable="false">
    <li slot="list-footer" class="pagination">
      <button @click="offset -= 10" :disabled="!hasPrevPage">Prev</button>
      <button @click="offset += 10" :disabled="!hasNextPage">Next</button>
    </li>
  </v-select>
</template>

<script>
import countries from '../data/countries';
export default {
  data: () => ({
    countries,
    search: '',
    offset: 0,
    limit: 10,
  }),
  computed: {
    filtered () {
      return this.countries.filter(country => country.includes(this.search));
    },
    paginated () {
      return this.filtered.slice(this.offset, this.limit + this.offset);
    },
    hasNextPage () {
      const nextOffset = this.offset + 10;
      return Boolean(this.filtered.slice(nextOffset, this.limit + nextOffset).length);
    },
    hasPrevPage () {
      const prevOffset = this.offset - 10;
      return Boolean(this.filtered.slice(prevOffset, this.limit + prevOffset).length);
    }
  },
};
</script>

<style scoped>
  .pagination {
    display: flex;
    margin: .25rem .25rem 0;
  }
  .pagination button {
    flex-grow: 1;
  }
  .pagination button:hover {
    cursor: pointer;
  }
</style>