zoukankan      html  css  js  c++  java
  • 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>
    
    

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

    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    [BZOJ]1018 堵塞的交通(SHOI2008)
    [BZOJ]1069 最大土地面积(SCOI2007)
    HDU5739:Fantasia——题解
    洛谷6186:[NOI Online 提高组]冒泡排序——题解
    洛谷4631 & UOJ415 & LOJ2586:[APIO2018] Circle selection 选圆圈——题解
    洛谷2014:[CTSC1997]选课——题解
    洛谷2758:编辑距离——题解
    洛谷4148 & BZOJ4066:简单题——题解
    洛谷4357 & BZOJ4520:[CQOI2016]K远点对——题解
    洛谷4320:道路相遇——题解
  • 原文地址:https://www.cnblogs.com/yesyes/p/15356908.html
Copyright © 2011-2022 走看看