天天看點

js 實作一個簡單的無限滾動

前言:vue項目中需要實作一個清單的無限滾動,引用的ui架構沒有這個元件,就自己實作了個比較簡單的無限滾動。

無限滾動的核心在于對滾動事件的監聽,當我們監聽到滾動條距離滾動區域底部一定的距離時,即加載下一頁的資料,合并到當頁的資料中,這樣就可以實作一個簡單的無限滾動了。

步驟:1.監聽滾動條 > 2. 在監聽事件裡計算滾動條距離滾動區域底部的距離,當距離不足10像素時,則加載下一頁資料

> 3. 元件銷毀,清除監聽器

// dom挂載完成後添加滾動區域的監聽
mounted() {
    this.scrollPanel = document.querySelector('.list-content')
    this.scrollPanel.addEventListener('scroll', this.throttle(this.loadMore))
  }

// 元件銷毀時清除監聽器
destroyed() {
    this.scrollPanel.removeEventListener('scroll', this.throttle(this.loadMore))
  }

methods: {
    loadMore(e) {
      const scrollTop = e.target.scrollTop // 已滾動到可視區域上方的高度
      const clientHeight = e.target.clientHeight // 可視區域高度
      const scrollHeight = e.target.scrollHeight // 滾動内容的總高度
      if (scrollHeight - (scrollTop + clientHeight) <= 10) { // 不足10像素觸發加載更多
        this.loadData()
      }
    },
    // 這裡判斷一下目前的資料量是否已經全部加載出來了,若已經加載完成則不再加載更多
    loadData() {
      if (this.totalCount > this.data.length) {
        this.pageIndex += 1
        this.getData()
      }
    },
    // 節流函數,節省性能
    throttle(fn, interval = 500) {
      let run = true
      return function() {
        if (!run) return
        run = false
        setTimeout(() => {
          fn.apply(this, arguments)
          run = true
        }, interval)
      }
    }
}
           

這個demo相當簡單,是以也存在一些不足。比如下拉加載更多資料的前提是必須要有滾動條,沒有滾動條則無法觸發,若第一次加載的資料量正好撐滿可滾動區域,這時候就無法下拉了。可以通過調整滾動區域的高度,或者監聽onwheel(滑鼠滾輪或觸摸闆滾動)事件,在該監聽事件裡實作加載更多

object.addEventListener("wheel", myScript);
           

另一個不足之處就是由于demo過于簡單,加載更多資料時,沒有動畫過渡,界面效果過于生硬。

以後有時間再做優化吧,就這樣。

繼續閱讀