VirtualScroll.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <template>
  2. <PageWrapper class="virtual-scroll-demo">
  3. <Divider>基础滚动示例</Divider>
  4. <div class="text-center mb-4">
  5. <a-button @click="vScrollRef?.scrollToTop()">滚动到顶部</a-button>
  6. <a-button @click="vScrollRef?.scrollToBottom()" class="mx-2">滚动到底部</a-button>
  7. <a-button @click="vScrollRef?.scrollToItem(scrollToItemIndex)"
  8. >滚动到第
  9. <input-number
  10. v-model:value="scrollToItemIndex"
  11. class="!w-60px mx-1"
  12. :min="1"
  13. :max="data.length"
  14. :precision="0"
  15. size="small"
  16. :controls="false"
  17. @keydown.enter="vScrollRef?.scrollToItem(scrollToItemIndex)"
  18. />
  19. </a-button>
  20. </div>
  21. <div class="virtual-scroll-demo-wrap">
  22. <VScroll :itemHeight="41" :items="data" :height="300" :width="300" ref="vScrollRef">
  23. <template #default="{ item }">
  24. <div class="virtual-scroll-demo__item">
  25. {{ item.title }}
  26. </div>
  27. </template>
  28. </VScroll>
  29. </div>
  30. <Divider>即使不可见,也预先加载50条数据,防止空白</Divider>
  31. <div class="virtual-scroll-demo-wrap">
  32. <VScroll :itemHeight="41" :items="data" :height="300" :width="300" :bench="50">
  33. <template #default="{ item }">
  34. <div class="virtual-scroll-demo__item">
  35. {{ item.title }}
  36. </div>
  37. </template>
  38. </VScroll>
  39. </div>
  40. </PageWrapper>
  41. </template>
  42. <script lang="ts" setup>
  43. import { PageWrapper } from '@/components/Page';
  44. import { VScroll } from '@/components/VirtualScroll';
  45. import { Divider, InputNumber } from 'ant-design-vue';
  46. import { ref } from 'vue';
  47. const vScrollRef = ref<typeof VScroll>();
  48. const scrollToItemIndex = ref(1000);
  49. const data = (() => {
  50. const arr: any[] = [];
  51. for (let index = 1; index < 20000; index++) {
  52. arr.push({
  53. title: '列表项' + index,
  54. });
  55. }
  56. return arr;
  57. })();
  58. </script>
  59. <style lang="less" scoped>
  60. .virtual-scroll-demo {
  61. &-wrap {
  62. display: flex;
  63. justify-content: center;
  64. margin: 0 30%;
  65. background-color: @component-background;
  66. }
  67. &__item {
  68. height: 40px;
  69. padding: 0 20px;
  70. border-bottom: 1px solid @border-color-base;
  71. line-height: 40px;
  72. }
  73. }
  74. </style>