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日

相关文章

  • 如何批量修改文件后缀名(任何文件的扩展名)?

    如何批量修改文件后缀名(任何文件的扩展名)? 有时候我们需要批量修改文件的后缀名,这可以通过以下步骤来完成: 步骤一:备份文件 在进行任何文件操作之前,建议先备份文件,以防止意外情况发生。 步骤二:选择合适的工具 有多种方法可以批量修改文件后缀名,下面介绍两种常用的方法。 方法一:使用命令行 打开命令行终端。 切换到包含要修改后缀名的文件的目录。 使用以下命…

    other 2023年8月5日
    00
  • (转)微信小程序破解ide

    (转)微信小程序破解ide 最近,有些开发者破解了微信小程序的开发IDE,分享了相关代码和教程,导致许多人对此产生争议。 我们强烈谴责此种行为,因为它严重违反了伦理和法律道德准则。为了避免带来的风险,我们也不建议开发者通过非法方式来AC该产品。 然而,我们也要注意到,这种情况并非个案,我们所能控制的事情实在太有限了。对于这种情况,请大家保持冷静,理性看待,充…

    其他 2023年3月28日
    00
  • 深度分析正则(pcre)最大回溯/递归限制

    深度分析正则(pcre)最大回溯/递归限制 正则表达式是一种描述字符模式的工具,由于其强大的表达能力和广泛的应用场景,成为了数据分析、文本挖掘等领域的重要工具。正则表达式引擎可以进行的匹配步骤是有限的,当模式中包含递归或回溯时,引擎可能会一直重复步骤,导致匹配效率降低,甚至出现崩溃等问题。 为了避免这种状况,正则表达式引擎实现了最大回溯/递归限制,即“PCR…

    other 2023年6月27日
    00
  • html5的canvas绘制线条 moveto和lineto详解

    HTML5的Canvas绘制线条:moveto和lineto详解 Canvas是HTML5中的一个很重要的标签,可以在其中通过JavaScript脚本绘制各种图形和动画效果,而绘制线条是Canvas中常见的操作之一。本文将介绍如何使用moveto和lineto两个命令在Canvas中绘制线条。 moveto命令 moveto命令用于将画笔移动到指定的坐标点,…

    其他 2023年3月28日
    00
  • Spring配置使用之Bean生命周期详解

    Spring配置使用之Bean生命周期详解 1. 简介 Spring容器在创建和管理Bean的过程中,会使用Bean生命周期回调方法对Bean进行初始化和销毁等操作。Bean生命周期回调方法可通过实现InitializingBean和DisposableBean接口,或者配置XML文件中特定的初始化和销毁方法来实现。 本文将介绍Spring Bean的生命周…

    other 2023年6月27日
    00
  • win11怎么剪切文件并粘贴? win11系统复制剪切粘贴的使用方法

    Win11如何剪切文件并粘贴 剪切文件 剪切是指将选定的文件或文件夹从原来的位置移动到剪贴板上,等待粘贴到另一个位置。Win11系统中,剪切文件的方法如下: 首先选中需要剪切的文件或文件夹,可以通过鼠标左键单击或者键盘上的Shift键加上方向键进行多选。 选中文件后,可以使用快捷键Ctrl+X进行剪切,或者通过右键菜单选择“剪切”选项。 示例:比如需要将D盘…

    other 2023年6月27日
    00
  • 将h265编码为hvc1编解码器

    以下是关于“将H.265编码为HEVC1编解码器”的完整攻略,包括基本概念、使用方法和两个示例。 基本概念 H.265和HEVC1都是视频编解码,H.265是一种高效的视频编码标准,而HEVC1是一种广泛使用的编码标准。将H.265编为HEVC1编解码器可以提高视频的兼容性和播放性能。 使用方法 以下是将H.265编码为HEVC1编解码器的方法: 安装FFm…

    other 2023年5月7日
    00
  • C语言中获取和改变目录的相关函数总结

    获取目录相关函数 C语言中可以通过使用<dirent.h>头文件中的函数获取目录信息。具体函数如下: opendir(const char *dirpath):打开一个目录(dirpath参数是目录路径),返回一个指向DIR结构体的指针。若打开失败,返回NULL。 readdir(DIR *dirp):读取下一个文件的信息,并返回文件信息的指针。…

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