vue2 vue-cli vue-infinite-scroll 简单制作无限加载效果

1,254 阅读2分钟

前言

如今的web开发中无限加载非常常见,本文将简单介绍如何通过vue-infinite-scroll简单编写一个无限加载效果。

安装

npm install vue-infinite-scroll --save

在main.js中加入:

import infiniteScroll from 'vue-infinite-scroll'
Vue.use(infiniteScroll)

image.png

示例

通过一个简单的小案例介绍一下如何使用。

先看效果图:

无限加载演示效果.gif

因为代码比较复杂我只展示关于无限加载的部分

截图2.png

<script>
import { mapGetters } from "vuex";
export default {
  data() {
    return {
      count: 3,
      data: [],
      busy: false,
      t: true,
    };
  },
  created() {
    // this.$store.dispatch("getNewList", [this.currentCatagtory, 3]);
  },
  computed: {
    ...mapGetters(["allData", "currentCatagtory"]),
  },
  watch: {
    currentCatagtory(newVaue, oldValue) {
      this.$store.dispatch("getNewList", [newVaue, 3]);
      console.log(newVaue);
    },
  },
  methods: {
    loadMore() {
      this.$store.dispatch("getNewList", [
        this.currentCatagtory,
        (this.count += 3),
      ]);
      this.busy = false;
    },
    throttle() {
      if (this.t === false) return;
      this.busy = true;
      this.t = false;
      console.log("我执行了");
      setTimeout(() => {
        this.loadMore();
        this.t = true;
      }, 3000);
    },
  },
};
</script>

简单介绍一下红色方框内的代码的意思

v-infinite-scroll="函数"表示回调函数是函数
infinite-scroll-disabled="busy"表示由变量busy决定是否执行函数false则执行loadMoretrue则不执行,看清楚,busy表示繁忙,繁忙的时候是不执行的。
infinite-scroll-distance="20"这里20决定了页面滚动到离页尾多少像素的时候触发回调函数,20是像素值。通常我们会在页尾做一个几十像素高的“正在加载中...”,这样的话,可以把这个div的高度设为infinite-scroll-distance的值即可。

然后简单介绍一下js部分

loadMore会发送ajax请求到后端,每加载一次像后端请求多加3条数据

throttle节流函数,3秒内只触发一次loadMore

这个效果的核心代码展示完毕,本身没有什么难点。下面介绍一下节流和防抖

节流和防抖

节流

节流就像他的名字一样,就像一个水龙头一直开到最大很浪费资源,每几毫秒触发一次,既不浪费,也源源不断。

本项目使用的是定时版节流。核心思想就是第一个函数开始定时器执行完之前第二个函数不生效

除了定时版还有时间戳版节流:

function throttle(func, wait) {
    var previous = 0;
    return function () {
        var now = Date.now();
        var context = this;
        var args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    }
}

时间戳版和定时器版的节流函数的区别就是,时间戳版的函数触发是在时间段内开始的时候,而定时器版的函数触发是在时间段内结束的时候。

防抖

防抖分为立即防抖非立即防抖

非立即防抖:触发事件后函数不会立即执行,而是在n秒之后执行,如果n秒之内又触发了事件,则会重新计算函数执行时间。

function debounce(func, wait) {
    var timeout = null;
    var context = this;
    var args = arguments;
    return function () {
        if (timeout) clearTimeout(timeout);
        timeout = setTimeout(function () {
            func.apply(context, args)
        }, wait);
    }
}

立即防抖:触发事件后函数会立即执行,然后n秒内不触发事件才会执行函数的效果

function debounce(func, wait) {
    var timeout = null;
    var context = this;
    var args = arguments;
    return function () {
        if (timeout) clearTimeout(timeout);
        var callNow = !timeout;
        timeout = setTimeout(function () {
            timeout = null;
        }, wait)
        if (callNow) func.apply(context, args)
    }
}