Vue3列表触底请求(上手体验hooks新特性)

news/发布时间2024/9/20 7:48:29

今天我们来聊一聊业务开发中的触底请求,其实就是分页的一种,只不过传统的分页感觉很丑而已,正好我的小博客最近在做触底分页,借此机会来说一说具体怎么实现的,以及来带领大家使用一下Vue3中的新特性hooks函数。

案例和我实际开发的功能会有差异,这里我只是想讲明白具体的思路。

一、触底分页思路

我这里就列举我自己实现的这种方式把,就是通过监听scroll,通过对比滚动卷入的高度(scrollTop)、窗口的高度(clientHeight)和滚动条的总高度(scrollHeight)三者之间插值的计算,来判断是否发起请求。

后续你可能还会判断:如果数据库没有更多的数据我们就不再请求等操作(这里我就不过多讲解了)。

二、Hooks函数

在 Vue 3 中,引入了 Composition API,它是一种新的 API 设计范式,为我们提供了更加灵活和可组合的代码组织方式。使我们的代码写起来更加的舒服,我们今天就来使用一下其中的一个重要概念Hooks

首先Hooks 是一种函数,以 use 开头,用于封装可复用的逻辑。它们提供了一种在函数组件中复用状态逻辑的方式,使我们能够更好地组织组件代码,将相关的逻辑聚合在一起,实现更高水平的可维护性。

借用知乎大佬的定义:集成定义一些可复用的方法,可以随时被引入和调用以实现高内聚低耦合的目标,应该都能算是hook。

下面我们就结合Hook函数,一起来实现一下触底功能。

三、Hooks具体实现

大家会学到两部分,触底的实现思路和hooks的使用。

3.1 创建文件

src 目录下创建 hooks/usePagination.js ,抛出一个函数,我们的所有业务都放在此函数中,并且通过 return 进行返回,我们会使用到一些 Vue钩子(ref, onMounted等),通过 import 进行导入。

import {ref, onMounted, onUnmounted } from 'vue'export const usePagination = () => {return {...}
}

3.2 编写触底业务函数

这里我用到了三个自己定义的变量loadingcurrentPagelist

  • loading:作用类似于节流,防止我们重复触底,重复请求;
  • currentPage:就是当前页码(默认为1);
  • list:来存储我们http请求的数据。

我们通过setTimeout来模拟一下http请求。

const loading = ref(false)
const loading = ref(false)
const list = ref([])const scrollBottom = () => {// 判断是否在请求阶段if(loading.value) return// 获取滚动条卷入的高度let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;// 获取可视区的高度let windowHeight = document.documentElement.clientHeight || document.body.clientHeight;// 获取滚动条的总高度let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;if (scrollTop + windowHeight >= scrollHeight) {console.log('开始请求');loading.value = true;currentPage.value ++setTimeout(() => {loading.value = false// http请求函数getList(currentPage.value)}, 2000)   }
}

3.3 http请求函数

请求函数接收两个参数,当前页和每次请求的条数,这个我通过for循环pushlist中来模拟。

const getList = (currentPage = 1, currentSize = 10) => {for (let i = 0; i < currentSize; i ++) {list.value.push({id: new Date().getTime(),})}console.log(list.value)
}

3.4 挂载触底函数

当我们组件加载/注销完成之后挂载/卸载我们的触底函数。

onMounted(() => {console.log('事件已挂载');window.addEventListener('scroll', scrollBottom);getList();
})onUnmounted(() => {console.log('事件已移除');window.removeEventListener('scroll', scrollBottom);
})

3.5 return数据

返回我们在组件中需要用到的变量函数

export const usePagination = () => {......return {currentPage,list,getList}
}

3.6 完整代码

import { ref, onMounted, onUnmounted } from 'vue'  export const usePagination = () => {const currentPage = ref(1)const list = ref([])const loading = ref(false)// 判断触底const scrollBottom = () => {if(loading.value) returnlet scrollTop = document.documentElement.scrollTop || document.body.scrollTop// 变量 windowHeight 是可视区的高度let windowHeight =
document.documentElement.clientHeight || document.body.clientHeight// 变量 scrollHeight 是滚动条的总高度let scrollHeight =
document.documentElement.scrollHeight || document.body.scrollHeight  if (scrollTop + windowHeight >= scrollHeight) {console.log('开始请求');loading.value = truecurrentPage.value ++setTimeout(() => {loading.value = falsegetList(currentPage.value)}, 2000)}}  // 请求数据const getList = (currentPage = 1, currentSize = 10) => {console.log(currentPage)for (let i = 0; i < currentSize; i ++) {list.value.push({id: new Date().getTime(),})}}onMounted(() => {console.log('事件已挂载');window.addEventListener('scroll', scrollBottom)getList()})onUnmounted(() => {console.log('事件已移除');window.removeEventListener('scroll', scrollBottom)})return {currentPage,list,getList}
}

四、组件使用

4.1 编写组件模板

我们编写一个列表来渲染我们的list数组

<template><div class="container"><div class="item" v-for="(item, index) in list" :key="item.id">我是列表内容{{ index + 1 }}</div></div>
</template><style lang="scss" scoped>
.container {display: flex;flex-direction: column;align-items: center;.item {width: 60%;height: 150px;border: 1px solid #000;margin-bottom: 10px;}
}
</style>

4.1 引入

通过import导入hook函数,执行hook函数,解构出我们需要的值,如果对解构不太了解的小伙伴,可以看我往期的文章,勇宝趣学JavaScript ES6第二章(解构赋值)

<script setup>
import { usePagination } from '@/hooks/usePagination';const { currentPage, list } = usePagination();</script>

五、效果

效果图晚点时间给小伙伴们呈现,在外边,这台笔记本没有做gif的工具,先放一个静态的图片给大家泄泄火把

4.PNG

六、总结

今天给大家讲解了一下触底的实现过程以及 Vue3 中hooks的上手体验,希望大家会对 Vue3 有一个更加深刻的认识。

说实话我写不出那些高大上的代码,哈哈哈,希望大家能理解我这个前端小菜鸟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/ueDy/9462.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

unity Android包安装运行后提示:此要用与最新版Android不兼容。

问题 unity 打包apk&#xff0c;安装运行后提示**“此要用与最新版Android不兼容。…” 解决办法 参考文献 https://blog.csdn.net/liweidecsdn/article/details/135997780

如何将实景三维倾斜模型叠加到三维地球上?

​ 通过以下方法可以将实景三维倾斜模型叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe&#xff0c;安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“倾斜模型”…

JS api基础初学

轮播图随机版 需求&#xff1a;当我们刷新页面&#xff0c;页面中的轮播图会显示不同图片以及样式 分析&#xff1a;①&#xff1a;准备一个数组对象&#xff0c;里面包含详细信息&#xff08;素材包含&#xff09; ②&#xff1a;随机选择一个数字&#xff0c;选出数组对应…

Java项目:30 基于SpringBoot自习室座位预定系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 功能设计 管理员 1、用户管理 管理员可以新增、删除管理员 管理员可以删除学生 2、自习室管理 管理员可以新增自习室、设置自习室的座位数量、开…

lnmp安装

一、安装lnmp 第一步&#xff1a;将MySQL 、论坛的安装包拖进shell 环境准备 lnmp 需要 安装 nginx mysql php 软件 第二步&#xff1a;解压nginx&#xff0c;再安装依赖包&#xff08;注意装在源配置文件下&#xff09;&#xff0c;关闭防火墙 systemctl disable --now fir…

map和set的简单介绍

由于博主的能力有限&#xff0c;所以为了方便大家对于map和set的学习&#xff0c;我放一个官方的map和set的链接供大家参考&#xff1a; https://cplusplus.com/ 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque&#x…

Redis 在 Linux 系统下安装部署的两种方式详细说明

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 Redis安装和配置 1、首先在官网下载好redis-6.0.9.tar.gzhttp://redis.io/ 或者使用 wget 命令下载&#xff1a;wget http://download.redis.io/releases/redis-6.0.9.tar.gz 2、下载使用上传到阿里…

【小沐学QT】QT学习之信号槽使用

文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法2.7 QSignalMapper方法 结语 1、简介 在GUI编程中&#xff0c;当我们更改一个小部件时&#xff0c;我们通常希望…

[SpringDataMongodb开发游戏服务器实战]

背景&#xff1a; xdb其实足够完美了&#xff0c;现在回想一下&#xff0c;觉得有点复杂&#xff0c;我们不应该绑定语言&#xff0c;最好有自己的架构思路。 七号堡垒作为成功的商业项目&#xff0c;告诉我&#xff1a;其实数据是多读少写的&#xff0c;有修改的时候直接改库也…

4核8g服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

前端 基础标签

!回车在vscode中可以生成简单的代码模板 注释 ctrl/ <h1></h1> 类似的数字越大字体越小 <p></p>表示一个段落 注:这里的回车会被解析成空格 <br> 单标签 表示换行 格式化标签 加粗标签 <strong></strong> <b></b> …

常用对象的遍历方法

var obj [{name: 1111,account: {01: { name: 1.1 },02: { name: 1.2 },03: { name: 1.3 },04: { name: 1.4 },05: { name: 1.5 },}} ]var nowObj obj[0].account;1、for…in 任意顺序遍历对象所有的可枚举属性&#xff08;包括对象自身的和继承的可枚举属性&#xff0c;不含…

前端-Vue3递归组件自定义Tree

需求 PS&#xff1a;写在前面&#xff0c;需求想要一个Tree 形结构展示当前的组织机构&#xff0c;最末层节点可以选择&#xff0c;层级明确。第一选择网上npm官网或者github 找找成型的东西 element-ui Tree 没有组织结构线js-tree 好看&#xff0c;但是适配Vue3 有点费劲&a…

Appium手机Android自动化

目录 介绍 什么是APPium&#xff1f; APPium的特点 环境准备 adb(android调试桥)常用命令 appium图形化简单使用 连接手机模拟器 使用appium桌面端应用程序 ​编辑 整合java代码测试 环境准备 引入所需依赖 书写代码简单启动 ​编辑 Appium元素定位 id定位 介…

【postgresql】数据表id自增与python sqlachemy结合实例

需求&#xff1a; postgresql实现一个建表语句&#xff0c;表名&#xff1a;student,字段id,name,age&#xff0c; 要求&#xff1a;每次添加一个数据id会自动增加1 在PostgreSQL中&#xff0c;您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…

Ubuntu系统下DPDK环境搭建

目录 一.虚拟机配置1.添加一个网卡(桥接模式)2.修改网卡类型3.修改网卡名称4.重启虚拟机5.查看网卡信息6.dpdk配置内存巨型页 三 DPDK源代码下载和编译1.下载源代码2.解压源代码3.安装编译环境4.编译5.设置dpdk的环境变量6.禁止多队列网卡7.加载igb_uio模块8.网卡绑定9.验证测试…

数据分类分级场景建设思路

数据分类分级是数据安全治理实践过程中的关键场景&#xff0c;是数据安全工作的桥头堡和必选题。本指南结合行业实践&#xff0c;提出如下图 所示的七步走建设思路&#xff0c;可供刚开展数据分类分级工作的组织参考。 来源&#xff1a;中国信息通信研究院 数据分类分级“七步…

PyTorch概述(七)---Optim

torch.optim是一个实现多种优化算法的包;很多常用的方法已经被支持;接口丰富;容易整合更为复杂的算法; 如何使用一个优化器 为了使用torch.optim包功能;用户必须构建一个优化器对象;该优化器将保持当前的参数状态且基于计算的梯度更新参数; 构建优化器 要构建一个优化器;必…

SD-WAN技术:优化国内外服务器访问的关键

在全球化的商业环境中&#xff0c;企业经常需要在国内访问国外的服务器。然而&#xff0c;由于地理位置和网络架构的限制&#xff0c;这种跨国访问往往会遇到速度慢、延迟高等问题。SD-WAN&#xff08;软件定义广域网&#xff09;技术的兴起&#xff0c;为企业提供了一种新的解…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础&#xff0c;它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行&#xff0c;分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…
推荐文章