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日

相关文章

  • c语言++放在前面和后面的区别分析

    C语言++放在前面和后面的区别分析 在C语言中,++操作符用于递增一个变量的值。然而,将++操作符放在变量的前面和后面会导致不同的结果。本文将详细讲解这两种用法的区别,并提供示例说明。 1. ++放在前面 当++操作符放在变量的前面时,它会先递增变量的值,然后返回递增后的值。这种用法被称为前缀递增。 示例代码: int a = 5; int b = ++a;…

    other 2023年8月5日
    00
  • C语言修炼之路函数篇真题训练下

    “C语言修炼之路函数篇真题训练下”是一个C语言函数应用的练习题,以下是完整的攻略: 1. 总体介绍 该练习题主要针对C语言函数应用的基本操作,包括函数的定义、调用及参数传递等问题。 题目难度适中,适合初学者练习,对于加深对C语言函数的理解和熟练掌握有很大帮助。 2. 练习内容 该练习题包含10道练习题,分别涉及如下内容: 函数的定义和调用 返回值类型及返回值…

    other 2023年6月27日
    00
  • 如何划分ip地址 划分IP地址的方法

    如何划分IP地址 IP地址是用于在互联网上唯一标识设备的一组数字。划分IP地址是将一个IP地址范围分割成多个子网的过程。这种划分可以帮助我们更有效地管理网络,并提供更好的网络性能和安全性。下面是划分IP地址的方法: 1. 子网掩码 子网掩码是用于划分IP地址的重要工具。它是一个32位的二进制数,用于将IP地址分成网络部分和主机部分。子网掩码中的1表示网络部分…

    other 2023年7月29日
    00
  • 卸载gitlab

    以下是卸载GitLab的完整攻略,包含两条示例说明: 卸载GitLab的完整攻略 在某些情况下,您可能需要卸载GitLab。本攻略将介绍如何在Linux系统上卸载GitLab,并提供两个示例说明。 步骤一:停止GitLab服务 在卸载GitLab之前,需要先停止GitLab服务。可以使用以下命令停止GitLab服务: sudo gitlab-ctl stop…

    other 2023年5月10日
    00
  • WinRAR压缩软件如何创建配置文件 WinRAR创建WinRAR.ini文件教程

    一、WinRAR压缩软件创建配置文件 WinRAR是一款非常流行的压缩软件,它不仅可以对文件进行压缩和解压缩,还可以有许多高级选项,例如创建RAR文件、加密压缩文件等。为了方便用户使用,WinRAR提供了创建配置文件的功能,将你常用的选项保存在一个配置文件中,方便下次打开WinRAR时直接使用。 二、WinRAR创建WinRAR.ini文件教程 1.打开Wi…

    other 2023年6月25日
    00
  • Lua中的模块与module函数详解

    Lua中的模块与module函数详解 在Lua中,模块是一种组织代码的方式,可以将相关的函数、变量和常量封装在一个独立的单元中。模块的使用可以提高代码的可维护性和重用性。Lua提供了module函数来定义和使用模块。 定义模块 要定义一个模块,可以使用module函数。下面是一个简单的示例: — mymodule.lua module(\"mym…

    other 2023年7月29日
    00
  • cd命令进入d盘文件夹

    如何使用cd命令进入D盘文件夹 在Windows操作系统中,使用cd命令可以进入指定的文件夹。下面是详细的攻略,包括两个示例说明。 1. 打开命令提示符 在Windows操作系统中,可以通过按下Win+R键,然后输入cmd并按下回车键来打开命令提示符。 2. 进入D盘 在命令提示符中,输入以下命令: D: 这个命令表示要进入D盘。 3. 进入文件夹 如果要进…

    other 2023年5月7日
    00
  • CSS选择器的新用法(推荐)

    CSS选择器的新用法(推荐) CSS选择器是用于选择HTML元素并应用样式的一种机制。在最新的CSS规范中,引入了一些新的选择器,这些选择器可以更方便地选择元素,提高开发效率。本攻略将详细介绍这些新的CSS选择器的用法。 1. 属性选择器 属性选择器允许根据元素的属性值来选择元素。在新的CSS规范中,属性选择器得到了增强,可以更灵活地选择元素。 示例1:选择…

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