• Vue自定义指令实现pc端加载更多


    原理

    document.documentElement.scrollTop + document.documentElement.clientHeight >= document.documentElement.scrollHeight
    

    只要知道什么时候滚动条到底部了,就知道了什么时间应该触发加载更多,当然有一些判断是不可少的,比如已经没有数据了,已经在加载中了就不要再次触发加载更多。

    示例

    <template>
      <div v-scroll="loadMore">
       <!-- 呈现你的列表数据,lists为数据,loading可以实现加载动画,noMore表示没数据了 -->
        <my-item :lists="lists" :loading="loading" :noMore="noMore" />
      </div>
    </template>
    <script>
    import MyItem from '../components/Item.vue'
    export default {
      data () {
        return {
          lists: this.$store.state.lists,
          page: 1,
          // 是否在加载中
          loading: false,
          // 请求到多少条数据
          count: '',
          // 每页多少条数据
          limit: 30,
          // 是否有更多数据
          noMore: false
        }
      },
      directives: {
        scroll: {
          bind (el, binding) {
            window.addEventListener('scroll', function () {
              let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
              if (scrollTop + document.documentElement.clientHeight >= document.documentElement.scrollHeight) {
                let loadData = binding.value
                loadData()
              }
            })
          }
        }
      },
      methods: {
        async loadMore () {
          // 没有正在加载中才会请求数据
          if (!this.loading) {
            if (this.noMore) {
              this.loading = false
              return
            }
    
            this.loading = true
            this.page = this.page + 1
            // 请求下一页数据
            await this.$store.dispatch('GET_LISTS', {
              page: this.page
            })
    
            let newData = this.$store.state.lists
            this.count = newData.length
    
            // 数据不够30且大于0肯定没更多数据了
            if (this.count < this.limit && this.count > 0) {
              this.noMore = true
              this.lists = this.lists.concat(newData)
              this.loading = false
            } else {
              // 数据刚好为30默认有更多数据
              this.noMore = false
              this.lists = this.lists.concat(newData)
              this.loading = false
            }
          }
        }
      },
      components: {
        MyItem
      }
    }
    </script>
    
    

    简单数行代码,轻松实现加载更多

    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    PS总结
    有用的官方API和官网
    获取jQuery DataTables 的checked选中行
    jQuery DataTables 问题:Cannot reinitialise DataTable
    jQuery DataTables 分页
    实现页面跳转和重定向的几种方法
    iframe父页面和子页面高度自适应
    双核浏览器默认选择内核渲染自己开发的网页
    使用母版页的子页面无法显示母版页图片
    gdb安装
  • 原文地址:https://www.cnblogs.com/yesyes/p/15356908.html
Copyright © 2020-2023  润新知