美文网首页前端🐶Vue相关
vue-infinite-scroll使用笔记

vue-infinite-scroll使用笔记

作者: microkof | 来源:发表于2018-10-10 17:09 被阅读1788次

    前言

    如今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条。就如下图:


    image.png

    选项解释

    v-infinite-scroll="loadMore"表示回调函数是loadMore
    infinite-scroll-disabled="busy"表示由变量busy决定是否执行loadMorefalse则执行loadMoretrue则不执行,看清楚,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的回调。

    相关文章

      网友评论

        本文标题:vue-infinite-scroll使用笔记

        本文链接:https://www.haomeiwen.com/subject/vsipaftx.html