Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use vue-virtual-scroll-list in Vuejs?

< script >
  export default {
    name: 'App',
    data() {
      return {
        items: [{
            price: '1',
            name: 'mm'
          },
          {
            price: '22',
            name: 'aa'
          },
          {
            price: '55',
            name: 'dd'
          },
          {
            price: '77',
            name: 'gg'
          },
          {
            price: '123',
            name: 'kk'
          },
          {
            price: '53',
            name: 'mn'
          },
          {
            price: '11',
            name: 'mm'
          },
          {
            price: '22',
            name: 'a'
          },
          {
            price: '33',
            name: 'd'
          },
          {
            price: '77',
            name: 'g'
          },
          {
            price: '1283',
            name: 'k'
          },
          {
            price: '589',
            name: 'n'
          }
        ]
      }
    }
  } <
  /script>
<template>
  <div id="app">
    <div class="wrapper">
      <virtual-list
        class="list"
        style="height: 360px; overflow-y: auto"
        :data-key="'item'"
        :data-sources="item"
        :data-component="item"
        :estimate-size="3"
      />
      <div class="item" v-for="item in items" :key="item">
        <div class="id">{{ item.price }} {{ item.name }}</div>
      </div>
    </div>
  </div>
</template>

I am trying to achieve virtual scroll in vuejs, I am able to render list in ui also, But unable to render them in virtual scroll. as shown in the image.

I am trying to achieve virtual scroll in vuejs, I am able to render list in ui also, But unable to render them in virtual scroll. as shown in the image.

tried installing :- npm install vue-virtual-scroll-list --save


1 Answers

You should create vue component for data-component prop like below:

Item.vue

<template>
  <div class="item">
    <span>{{ index }} - {{ source.name }}</span>
  </div>
</template>

<script>
export default {
  props: {
    index: {
      type: Number,
      default: 0
    },
    source: {
      type: Object,
      default() {
        return {}
      }
    }
  }
}
</script>

<style  lang="scss" scoped>
.item {
  border-bottom: 1px solid gray;
}
</style>

And then use it in virtual-list

App.vue

<template>
  <div id="app">
    <div class="wrapper">
      <virtual-list
        class="list"
        style="height: 360px; overflow-y: auto"
        data-key="key"
        :keeps="20"
        :data-sources="computedItems"
        :data-component="Item"
      />
    </div>
  </div>
</template>

<script>
import Item from './Item'
export default {
  name: 'App',
  data() {
    return {
      Item,
      items: [
        { price: '1', name: 'mm' },
        { price: '22', name: 'aa' },
        { price: '55', name: 'dd' },
        { price: '77', name: 'gg' },
        { price: '123', name: 'kk' },
        { price: '53', name: 'mn' },
        { price: '11', name: 'mm' },
        { price: '22', name: 'a' },
        { price: '33', name: 'd' },
        { price: '77', name: 'g' },
        { price: '1283', name: 'k' },
        { price: '589', name: 'n' }
      ]
    }
  },
  computed: {
    computedItems() {
      return this.items.map((item, index) => {
        item.key = `item_${index}`
        return item
      })
    }
  }
}
</script>

If you don't have unique key for each item, create an computed method to add it like in example.

Here is code

like image 54
Vasile Radeanu Avatar answered Sep 04 '25 20:09

Vasile Radeanu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!