vue实现下拉加载其实没那么复杂

下面我将为您详细讲解“Vue实现下拉加载其实没那么复杂”的完整攻略。

1. 实现思路

实现下拉加载的思路比较简单,主要是利用vue的组件化和axios的数据请求。首先创建一个可滚动加载的组件,在其生命周期中利用axios请求数据并更新到组件的显示列表中,当滚动到底部时再次触发axios请求数据,重复更新从而实现下拉加载。

2. 实现步骤

2.1 创建可滚动加载的组件

组件分为模板、样式和脚本三部分,模板中创建列表展示组件,并在mountedactivated生命周期中设置滚动事件监听。

<template>
  <div class="scroll" ref="scroll">
    <ul>
      <li v-for="(item, index) in list" :key="index">{{ item }}</li>
    </ul>
    <div class="loading" v-show="isLoadMore">
      <span>正在加载中</span>
    </div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      page: 1,
      pageSize: 10,
      list: [],
      isLoadMore: false,
      isFinished: false
    };
  },
  methods: {
    fetchData() {
      return axios.get(`/api/list?page=${this.page}&pageSize=${this.pageSize}`);
    },
    handleScroll() {
      const scrollHeight = this.$refs.scroll.scrollHeight;
      const scrollTop = this.$refs.scroll.scrollTop;
      const clientHeight = this.$refs.scroll.clientHeight;
      const diff = scrollHeight - scrollTop - clientHeight; //计算滚动距离
      if (diff <= 0 && !this.isLoadMore && !this.isFinished) {
        this.isLoadMore = true;
        this.fetchMoreData();
      }
    },
    fetchMoreData() {
      this.page++;
      this.fetchData()
        .then(res => {
          this.list = this.list.concat(res.data.list);
          if (res.data.list.length < this.pageSize) {
            this.isFinished = true;
          } else {
            this.isLoadMore = false;
          }
        })
        .catch(err => {
          console.log(err);
        });
    }
  },
  mounted() {
    this.$refs.scroll.addEventListener('scroll', this.handleScroll);
    this.fetchData().then(res => {
      this.list = res.data.list;
    });
  },
  destroyed() {
    this.$refs.scroll.removeEventListener('scroll', this.handleScroll);
  },
  activated() {
    this.$refs.scroll.addEventListener('scroll', this.handleScroll);
  },
  deactivated() {
    this.$refs.scroll.removeEventListener('scroll', this.handleScroll);
  }
};
</script>

<style>
.scroll {
  height: 200px;
  overflow-y: auto;
}
.loading {
  text-align: center;
  margin-top: 10px;
  margin-bottom: 10px;
}
</style>

2.2 发送请求获取数据

利用axios发送异步请求获取数据,将获取到的数据更新到组件的list列表中。

fetchData() {
  return axios.get(`/api/list?page=${this.page}&pageSize=${this.pageSize}`);
}

2.3 监听滚动事件

利用addEventListener添加滚动事件的监听,并在滚动到底部触发进行新一轮数据更新。

handleScroll() {
  const scrollHeight = this.$refs.scroll.scrollHeight;
  const scrollTop = this.$refs.scroll.scrollTop;
  const clientHeight = this.$refs.scroll.clientHeight;
  const diff = scrollHeight - scrollTop - clientHeight; //计算滚动距离
  if (diff <= 0 && !this.isLoadMore && !this.isFinished) {
    this.isLoadMore = true;
    this.fetchMoreData();
  }
},

2.4 重复更新列表数据以实现下拉加载

fetchMoreData方法中,利用concat方法将新获取的数据添加到列表最后,并根据当前返回的数据数与请求时设定的每页数据数来判断是否需要进行下一轮数据请求。

fetchMoreData() {
  this.page++;
  this.fetchData()
    .then(res => {
      this.list = this.list.concat(res.data.list);
      if (res.data.list.length < this.pageSize) {
        this.isFinished = true;
      } else {
        this.isLoadMore = false;
      }
    })
    .catch(err => {
      console.log(err);
    });
}

3. 示例说明

3.1 示例1:网络API中获取数据

我们可以模拟后台接口,通过axios获取数据,模板如下:

fetchData() {
  return axios.get(`/api/list?page=${this.page}&pageSize=${this.pageSize}`);
}

3.2 示例2:本地文件中的数据

我们也可以将需要展示的数据存放在本地json文件中,通过axios进行数据读取。例如我们存放以下数据到本地文件list.json

{
  "list": [
    "第1条数据",
    "第2条数据",
    "第3条数据",
    "第4条数据",
    "第5条数据",
    "第6条数据",
    "第7条数据",
    "第8条数据",
    "第9条数据",
    "第10条数据",
    "第11条数据",
    "第12条数据",
    "第13条数据",
    "第14条数据",
    "第15条数据",
    "第16条数据",
    "第17条数据",
    "第18条数据",
    "第19条数据",
    "第20条数据"
  ]
}

在发送数据请求时通过读取本地文件来获取数据:

fetchData() {
  return axios.get('/api/list.json');
}

以上就是“Vue实现下拉加载其实没那么复杂”的一个完整攻略,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现下拉加载其实没那么复杂 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • vue px转rem配置详解

    Vue px转rem配置详解 什么是px和rem px:是像素,是网页最常用的长度单位。 rem:是一种相对单位,它是根据根元素的字体大小而定的单位,也就是说当根元素的字体大小发生变化时,原本以rem作为单位的元素也会随之改变。 为什么需要将px转为rem 移动端屏幕尺寸多种多样,我们使用不同的屏幕访问页面就会发现页面布局等效果有差异。 根据设备宽度动态改变…

    other 2023年6月27日
    00
  • JAVA中堆、栈,静态方法和非静态方法的速度问题

    JAVA中堆、栈,静态方法和非静态方法的速度问题 在Java中,堆和栈是两种不同的内存区域,而静态方法和非静态方法是两种不同的方法类型。它们在速度方面有一些区别。 堆和栈的速度问题 堆 堆是用于存储对象的内存区域。在堆中分配内存需要动态分配和回收,因此速度相对较慢。堆中的对象可以被多个线程共享,因此需要进行线程同步操作。 示例说明1:堆中的对象分配和回收 p…

    other 2023年10月15日
    00
  • C语言指针基础详解

    C语言指针基础详解 C语言的指针是一种非常重要的概念,在程序开发中经常用到。本篇文章将介绍C语言指针的基础知识,包括指针的定义、初始化、取值、运算等内容,以及指针在实际开发中的应用。 指针的定义 指针是一个变量,其存储的数据是一个内存地址。指针变量需要定义数据类型,指针的数据类型和指向的变量的数据类型必须匹配。指针的声明形式如下: int *ptr; 上述代…

    other 2023年6月27日
    00
  • IDEA 2020.1 for Mac 下载安装配置及出现的问题小结

    IDEA 2020.1 for Mac 下载安装配置及出现的问题小结 下载 IDEA 2020.1 for Mac 首先,你需要下载 IDEA 2020.1 for Mac 的安装包。你可以在 JetBrains 官方网站上找到该软件的下载链接。点击下载链接,选择适用于 Mac 的版本。 安装 IDEA 2020.1 for Mac 安装 IDEA 2020…

    other 2023年8月18日
    00
  • ListView下拉列表控件使用方法详解

    ListView下拉列表控件使用方法详解 简介 ListView是一种常用的下拉列表控件,可以实现列表数据的显示与选择。本篇文章将详细介绍ListView的使用方法。 实现方式 ListView通常可以通过以下两种方式实现: 通过代码手动创建 通过XML布局文件创建 通过代码手动创建 下面是一个通过代码手动创建ListView的示例: ListView li…

    other 2023年6月26日
    00
  • 如何禁止修改ip地址?

    如何禁止修改IP地址攻略 禁止修改IP地址可以帮助保护网络的安全性和稳定性。下面是一些步骤和示例说明,以帮助你实施这一措施。 步骤1:使用静态IP地址 使用静态IP地址可以防止用户轻易修改其IP地址。静态IP地址是在网络设置中手动配置的,而不是通过DHCP自动分配的。以下是如何设置静态IP地址的示例说明: 打开计算机的网络设置。 找到当前网络连接的设置选项。…

    other 2023年7月30日
    00
  • Java getResource()如何获取class文件目录位置

    Java中的getResource()方法用于从类路径中获取资源,获取资源的路径可以是绝对路径,也可以是相对路径。方法的返回值是一个URL对象。 下面我们来讲解如何使用getResource()方法获取class文件目录位置: 获取class文件所在目录绝对路径 获取class文件所在目录的绝对路径可以使用以下代码: URL url = xxx.class.…

    other 2023年6月27日
    00
  • IETester 网站在多IE版本兼容性测试工具使用方法

    IETester 网站在多IE版本兼容性测试工具使用方法攻略 简介 IETester 是一款用于测试网站在多个 Internet Explorer(IE)版本上的兼容性的工具。它允许用户在同一界面中同时运行多个 IE 版本,以便快速检查网站在不同版本的 IE 上的表现。 步骤 步骤 1:下载和安装 IETester 打开浏览器,访问 IETester 的官方…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部