【Vue3】利用VueUse实现useInfiniteScroll虚拟滚动操作

这篇具有很好参考价值的文章主要介绍了【Vue3】利用VueUse实现useInfiniteScroll虚拟滚动操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们先来看一下效果展示

useinfinitescroll,vue.js,前端,javascript

一、什么是无限滚动?关键是什么?如何使用?需要注意的是什么?

  • 1、infiniteScroll无限滚动是一种在网页或应用程序中实现动态加载内容的技术,它允许用户在滚动页面时无需点击分页或刷新按钮自动加载更多内容,从而提供更流畅的用户体验,传统的分页加载需要用户点击下一页或下载更多的按钮来获取更多内容,而无限滚动通过监听用户的滚动行为,当用户接近页面底部时,自动触发加载新数据,将其追加到当前页的尾部,这样用户就可以
    无限的滚动浏览内容,而不需要中断浏览体验,去手动加载
  • 2、无限滚动通常用于需要展示大量数据的页面,比如社交媒体的动态消息流,商品列表、图片库等,它可以减少用户的点击操作提高浏览效率
  • 3、实现无限滚动的关键,是通过监听滚动事件,向服务器请求新的数据,当滚动达到一定的预值时,向服务器发送用户请求,获取新的数据,并将其插入页面当中,这样就实现了无缝加载新内容的效果
  • 4、需要注意的是:在加载数据时要合理控制数据加载频率,避免过于频繁的请求数据,以免影响性能和用户体验,同时还需要处理好加载错误和异常情况,
    保证用户可以正常的浏览数据

二、使用JSONPlaceholder进行在线模拟数据【为了方便】

入口:JSONPlaceholder

useinfinitescroll,vue.js,前端,javascript
注:作者这里使用的 /photos 接口

三、创建api/getPhotos.ts文件夹配置axios

import axios from 'axios';
const getPhotos = async(page:number ,limit:number) => {
    const result = await axios.get(
    //这个接口就是上面从JSONPlaceholder]模拟数据的接口
        `https://jsonplaceholder.typicode.com/photos?_page=${page}&_limit=${limit}`
    )
    return result.data;
}
export default getPhotos;

四、重点:VueUse第三方功能类库

入口:VueUse

1、VueUse第三方功能类库,提供了一些可复用的Vue 组合式API函数和自定义的指令,以便帮助开发者更高效的去构建vuejs的应用程序
2、vueUse的目标的通过提供常用的功能和模块增强vuejs应用程序的开发体验,它包含了大量的实用工具和功能涵盖了从状态管理、副作用处理、表单处理、动画、浏览器API等各方面的功能

导入模块
import { useInfiniteScroll } from "@vueuse/core";

五、全部代码实现

  • 创建InfiniteScroll 组件
<template>
<ul ref="listEL" class="container">
    <div v-for="item in photosList" :key="item.id" class="item">
      <h2>{{ item.id }} {{ item.title }}</h2>
      <img :src="item.thumbnailUrl" class="thumb" />
    </div>
    <div v-if="fetchingData" class="fetchingData">正在请求更多数据中.....</div>
  </ul>
</template>

逻辑

<script setup lang="ts">
import { onMounted, ref } from "vue";
import getPhotos from "../api/getPhotos";
// 引入useInfiniteScroll
import { useInfiniteScroll } from "@vueuse/core";
//设置列表的元素内容,使listEL的类型是HTMLElement或null
const listEL = ref<HTMLElement | null>(null);
const limit = ref(10);
const page = ref(1);
interface Iphoto {
  albumId: number;
  id: number;
  url: string;
  title: string;
  thumbnailUrl: string;
}
const photosList = ref<Iphoto[]>([]);
const fetchingData = ref(false);
const canLoadMore = ref(true);

const getPhotosOnScroll = async () => {
    // 中断处理
  if (!canLoadMore.value || fetchingData.value) return;
  fetchingData.value = true;
  //延迟请求
  await new Promise((resolve) => setTimeout(resolve, 2000));
  //滚动图片的内容
  const newPhotos = await getPhotos(page.value, limit.value);
  if(newPhotos.length < limit) {
    canLoadMore.value = false;
  }
  photosList.value = [...photosList.value, ...newPhotos];
  page.value++;
  fetchingData.value = false;
};

useInfiniteScroll(
  listEL,
  async () => {
    await getPhotosOnScroll();
  },
  {
    distance: 15,
  }
);
</script>

样式

<style lang="scss" scoped>
.container{
    overflow-y: scroll;
    height: 650px;
    margin-top: 20px;
    padding: 5px;
    .item{
        height: 150px;
        // display: flex;
        // flex-direction: column;
        margin-bottom: 60px;
    }
    .thumb{
        height: 150px;
        width: 150px;
    }
    .fetchingData {
        text-align: center;
        color: gray;
        background-color: white;
        padding: 1rem;
        margin: 0;
    }
}
</style>
  • App.vue ——引入InfiniteScroll 组件
<template>
  <div>
    <h1>利用VueUse实现Infinite实现无限滚动</h1>
    <InfiniteScroll />
  </div>
</template>
<script setup>
import InfiniteScroll from './components/infiniteScroll.vue'

</script>
<style scoped>
</style>

今天的内容就到这里啦谢谢
useinfinitescroll,vue.js,前端,javascript文章来源地址https://www.toymoban.com/news/detail-791141.html

到了这里,关于【Vue3】利用VueUse实现useInfiniteScroll虚拟滚动操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • useInfiniteScroll --- react滚动加载

            无限滚动的基本思想是,我们不会一次性加载所有数据,而是在用户向下滚动页面时逐步加载数据。这给用户以无尽的内容列表的感觉,而无需等待所有数据一次性加载。          使用useInfiniteScroll hook可以处理检测用户何时滚动到页面底部的逻辑,并触发回

    2024年02月06日
    浏览(27)
  • Vue3最佳实践 第六章 Pinia,Vuex与axios,VueUse 4(axios)

      axios 是一个基于 Promise 的 HTTP 客户端,不仅可以与 vue.js 一起使用,还可以与其他前端框架以及后端 Node.js 一起使用。当你想从包括后端服务器在内的外部服务获取数据时,可以使用axios 中的方法很方便的获得数据内容。在本文档中,我们将介绍如何在 vue.js 版本 3 的环境

    2024年02月07日
    浏览(27)
  • Vue3 实现一个无缝滚动组件(支持鼠标手动滚动)

    前言 在日常开发中,经常遇到需要支持列表循环滚动展示,特别是在数据化大屏开发中,无缝滚动使用频率更为频繁,在jquery时代,我们常用的无缝滚动组件为liMarquee,在vue中已经有vue-seamless-scroll组件(通过Vue2实现,不支持鼠标手动滚动),但是在使用过程中,发现滚动后

    2024年02月08日
    浏览(33)
  • vue3 | 数据可视化实现数字滚动特效

    vue3不支持vue-count-to插件,无法使用vue-count-to实现数字动效,数字自动分割,vue-count-to主要针对vue2使用,vue3按照会报错: TypeError: Cannot read properties of undefined (reading \\\'_c\\\') 的错误信息。这个时候我们只能自己封装一个CountTo组件实现数字动效。先来看效果图: 使用Vue.component定义公

    2024年02月02日
    浏览(34)
  • vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

    近期在开发可视化大屏项目,除去各种 echarts 图表和地图展示之外还有多个表格。现在来了一个需求,需要将大屏中的所有表格设置为内容无缝滚动。 本着程序员的七宗罪原则第一时间推脱了一下,但没推脱成功。 简单的在网上查了下适合我们项目的有两种方案,第一种是

    2024年02月09日
    浏览(33)
  • vue3 实现门户网站页面鼠标滚轮控制页面上下滚动---类似轮播图

    案例参考:首页_CNESA 储能研究平台 //监听鼠标滚动事件  window.addEventListener(\\\'mousewheel\\\', debounce(methodB,300), true)||window.addEventListener(\\\"DOMMouseScroll\\\",debounce(methodB,300),false) const debounce = (func, wait) ={         let timeout;         return  function() {             let context = this;            

    2024年02月12日
    浏览(38)
  • vue3+element-plus 通过v-infinite实现下拉滚动无限加载

    v-infinite官网 v-infinite-scroll无限滚动组件使用详解  官网给到的基础案例: 自己写了一个简单的demo: 当使用v-infinite时,控制台会报错:  原因: 官方上的Issues解释是需要nextTick()之后再去显示 解决方法是组件挂载完成再去显示el-select组件 所以在上面demo中select组件加了v-if,

    2024年02月09日
    浏览(38)
  • Vue 3 + Element UI Plus 实现 Select 下拉框的虚拟滚动效果详解与代码示例

    在 Vue 3 项目中,当下拉框中的选项过多时,使用虚拟滚动可以提升性能和用户体验。本文将介绍如何使用 Vue 3 和 Element UI Plus(el-select-plus)组件实现 Select 下拉框的虚拟滚动效果,并提供详细的代码示例。 首先,确保你已经安装了 Element UI Plus,它是 Element UI 的扩展版本,支

    2024年02月08日
    浏览(39)
  • vue3利用 a 标签,文件流,JSZip 压缩包,实现文件下载

    在实现文件的下载,采用 a 标签,会出现图片,没有进行下载,而是,在当前页面打开了图片。 导致原因: ·a标签,有 download 属性,可以实现下载 同源文件( ip 和 端口 相同),当图片不同源 时,点击下载,会在当前窗口直接打开图片,而不是进入下载状态。 1.1 没有图片

    2023年04月08日
    浏览(30)
  • Vue3 入门笔记 ---- 利用Element Plus对页面进行布局划分以及实现左侧公共菜单

    这个系列的笔记重点会放在怎么样利用Vue3把项目架设起来并跟后端API互动,不会介绍Vue的基础特性,关于Vue的基础特性可以参考这个视频四个小时带你快速入门Vue,我是看这个入门的,觉得还不错。 代码地址: https://github.com/yexia553/vue_study/tree/%E9%85%8D%E7%BD%AEvue-router/vue3-note

    2024年02月04日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包