A vue component support infinite scroll list.Different item height is also supported.
note: Vue version >= 2.3 is needed.
$ npm install vue-scroll-list --save-dev
<template> <div id="app"> <h2>vue-scroll-list with infinite data</h2> <h3>random height</h3> <h4>total: {{count}}</h4> <div class="wrapper"> <scroll-list :debounce="50" :remain="10" :enabled="true" :keep="true" @toTop="onTop" @toBottom="onBottom" @scrolling="onScroll"> <div v-for="(item, index) in list" :key="item.index" :class="['item']" :style="{height: item.itemHeight + 'px', 'line-height': item.itemHeight + 'px'}" v-bind="{'data-height': item.itemHeight}"> index:{{item.index}} / height:{{item.itemHeight}} </div> </scroll-list> </div> </div> </template> <script> import scrollList from 'vue-scroll-list'; export default { name: 'app', data() { return { list: [], heightList: [], count: 0 }; }, components: { scrollList }, methods: { onTop() { console.log('[demo]:page to top.'); }, onBottom() { console.log('[demo]:page to bottom.'); !window.__stopLoadData && this.createData(); }, onScroll(event) { window.__showScrollEvent && console.log(event); }, createData() { let size = window.__createSize || 40; this.count += size; for (let i = this.count - size; i < this.count; i++) { let itemHeight = Math.round(Math.random() * 100) + 40; this.list.push({ index: i, itemHeight: itemHeight }); // this.heightList.push(itemHeight); } console.log('[demo]:' + size + ' items are created.') } }, created() { window.__createSize = 40; window.__stopLoadData = false; window.__showScrollEvent = false; this.createData(); } }; </script> <style scoped> #app { text-align: center; } .wrapper { height: 400px; padding: 0; border: 1px solid #eee; -webkit-overflow-scrolling: touch; } .item { border-bottom: 1px solid #eee; overflow: hidden; } .item:last-child { border-bottom: 0; } .scroll-container { transform: translate3d(0, 0, 0); } </style>
You can define the height of container(such as the ul tag above) by the css height.
note: You can run this demo by npm run dev.
Available Prop :
| Prop | Type | Required | Description |
|---|---|---|---|
| heights | Array | * | An array contains all height of your item.If you want to use data-height,please ignore this option. |
| remain | Number | * | The number of item that show in view port.(default 10) |
| keep | Boolean | * | Work with keep-alive component,keep scroll position after activated.(default false) |
| enabled | Boolean | * | If you want to render all data directly,please set 'false' for this option.But toTop、toBottom and scrolling event is still available.(default true) |
| debounce | Number | * | Milliseconds of using debounce function to ensure scroll event doesn't fire so often.(disabled by default) |
| step | Number | * | Pixel of using throttle theory to decrease the frequency of scroll event.(disabled by default) |
Available Event :
| Event | Description |
|---|---|
| toTop | An event emit by this library when this list is scrolled on top. |
| toBottom | An event emit by this library when this list is scrolled on bottom. |
| scrolling | An event emit by this library when this list is scrolling. |
heights property is an array contains all height of your item,but you can tell us the height of each item by setting the data-height property.
Sometimes you may need to change the height of each item or filter your item.This may cause some blank problems.So you'd better call update function to tell us.
<scroll-list ref="vueScrollList" :debounce="50" :remain="10" :enabled="true" :keep="true" @toTop="onTop" @toBottom="onBottom" @scrolling="onScroll"> <div v-for="item in list" :key="item.index" :class="['item']" :style="{height: item.itemHeight + 'px', 'line-height': item.itemHeight + 'px'}" v-bind="{'data-height': item.itemHeight}"> index:{{item.index}} / height:{{item.itemHeight}} </div> </scroll-list>
this.$refs.vueScrollList && this.$refs.vueScrollList.update();