前言
如今web开发中,无限加载是必需的一项功能,尤其是在移动端开发中,一个列表往往默认只加载10条,想看更多只能逐渐往下翻页。那么今天就看看如何在Vue-Cli中实现这个功能。
我查了当前最流行的几个插件,大多是基于jQuery的,好在,Element UI的开发者开发了一款专用于Vue的vue-infinite-scroll插件,今天就试用一下。
安装
官网是:https://github.com/ElemeFE/vue-infinite-scroll
npm install vue-infinite-scroll --save
尽管官方也推荐了几种载入方式,但“最vue”的方式肯定是在main.js中加入:
import infiniteScroll from 'vue-infinite-scroll'
Vue.use(infiniteScroll)
实现范例
官方给的代码范例是假设你在根组件写代码,实际上我们肯定是在子组件里写代码,所以代码也需要略作修改,下方只列有用的代码片段:
<div v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
<div v-for="item in data" :key="item.index">{{item.name}}</div>
</div>
data () {
return {
count: 0,
data: [],
busy: false
}
}
methods: {
loadMore: function() {
this.busy = true
setTimeout(() => {
for (var i = 0, j = 10; i < j; i++) {
this.data.push({name: this.count++ })
}
console.log(this.data)
this.busy = false
}, 1000)
}
}
效果
默认会载入10行数据,只要往下滚动到页面底部,就会在1秒后再次加载10条,然后继续滚动,又会加载10条。就如下图:
选项解释
v-infinite-scroll="loadMore"
表示回调函数是loadMore
infinite-scroll-disabled="busy"
表示由变量busy
决定是否执行loadMore
,false
则执行loadMore
,true
则不执行,看清楚,busy表示繁忙,繁忙的时候是不执行的。
infinite-scroll-distance="10"
这里10
决定了页面滚动到离页尾多少像素的时候触发回调函数,10
是像素值。通常我们会在页尾做一个几十像素高的“正在加载中...”,这样的话,可以把这个div的高度设为infinite-scroll-distance
的值即可。
其他选项:
infinite-scroll-immediate-check
默认值为true
,该指令意思是,应该在绑定后立即检查busy的值和是否滚动到底。如果你的初始内容高度不够高、不足以填满可滚动的容器的话,你应设为true
,这样会立即执行一次loadMore
,会帮你填充一些初始内容。
infinite-scroll-listen-for-event
当事件在Vue实例中发出时,无限滚动将再次检查。
infinite-scroll-throttle-delay
检查busy
的值的时间间隔,默认值是200,因为vue-infinite-scroll的基础原理就是,vue-infinite-scroll会循环检查busy
的值,以及是否滚动到底,只有当:busy为false且滚动到底,回调函数才会执行。
实战应用
可以看到,上方的例子是在不断的修改data变量,data变量的数据不断增加,这看起来是没错的。但是,实战中,我们的新数据肯定是Ajax获取的,并不是范例中的用for循环来灌入无用的自然数,而且,并不需要setTimeout,我们希望的是页面滚动到底部就立即执行Ajax,事实上,上面代码中的setTimeout只是为了模拟一个延迟加载的效果,并不是说必须要延迟1秒才Ajax。
实战中该怎么做?
只需要将这段模拟Ajax的代码改为真正的Ajax获取数据的代码即可:
setTimeout(() => {
for (var i = 0, j = 10; i < j; i++) {
this.data.push({name: this.count++ })
}
console.log(this.data)
this.busy = false
}, 1000)
另外,this.busy = false
也必须作为Ajax的回调。