React - 实现瀑布流加载

news2024/11/29 2:30:22

React - 实现瀑布流加载

  • 一. 瀑布流实现
    • 1.1 处理重复请求问题

一. 瀑布流实现

先来看下原本的效果,一次性加载完所有的信息然后展示:
在这里插入图片描述
其次,我们需要去监听这个滚轮的滚动事件,那么React页面就可以添加一个监听器:

useEffect(() => {
  // 初始化动作
  initData();
  // 指定事件是否在捕获或冒泡阶段执行。true - 事件句柄在捕获阶段执行
  window.addEventListener('scroll', handleScroll, true);
  // 一定要有这段代码,在关闭你的页面或者跳转的时候,要把对应的监听器移除
  return () => {
    window.removeEventListener('scroll', handleScroll, true);
  };
}, [ ]);

那么这个handleScroll函数,就是用来在发生滚动事件的时候,你要做的事情。既然我们要实现瀑布流,那么自然而然的就是去后端请求数据。但是,请求数据得有一个前提:你的滚动条已经到达页面的底部了。

dom元素有这么三个属性:

  • clientHeight:内容可视区域的高度。

  • scrollTop:滚动条在Y轴上的滚动距离。

  • scrollHeight:内容可视区域的高度加上溢出(滚动)的距离。

判断滚动条到达底部的条件则为:

scrollTop + clientHeight === scrollHeight

那么这个dom元素的依据是什么?你项目里面,哪一个标签下写了css,有滚动条,就应该取哪一个标签。例如我自己的项目有这么一段代码:请注意,我这里加了overflow

<Content style={{ overflow: 'auto', marginLeft: 200, height: '100%' }} id='zong_Content'>
  <div style={{ minWidth: 1340 }}>
    {props.children}
  </div>
</Content>

对应的css元素:
在这里插入图片描述
对应
在这里插入图片描述
我把这里贴出来的本意是要告诉大家,你在写滚动条监听事件的时候,当你需要计算滚动的距离,你就要找对滚动条所在的标签,否则距离算出来就是错的。

那么我这里的代码对应的就是:

// 页面滚动
  const handleScroll = () => {
    const liveDom :any = document.getElementById('zong_Content');
    const clientHeight = liveDom.clientHeight;
    const scrollTop = liveDom.scrollTop;
    const scrollHeight = liveDom.scrollHeight;
    if (scrollTop + clientHeight === scrollHeight) {
      console.log('到底部了!');
    }
  };

让我们来看看效果:
在这里插入图片描述

可见滚动条到达底部的时候,就能输出对应的字样。只不过我这里没有写请求后端数据的代码。但是别急。你们有没有注意到:

  1. 当你滚动条到达页面最底部的时候,确实打印出了到底部了!的字样。
  2. 但是当你滚动条往上滑一点点,再往下滑到底部的时候,还是会打印这样的字样。

这样有什么问题?不妨试想一下,下面的请求数据伪代码如果写上会有什么效果:

if (scrollTop + clientHeight === scrollHeight) {
  console.log('到底部了!');
  loadData();
}

当你调用了loadData();接口,但是后端数据还没有返回。假设用户在前端浏览器上,滚动条在最底部和上方来回滚动10次,那么就会请求10遍接口。就会有重复请求的问题。

1.1 处理重复请求问题

因此我们应该对代码做出如下修改:

let loading = false;

const loadData = async () => {
  if (!loading) {
    loading = true;
    await dispatch({
      type: 'live/getMusicItem',
      payload: {},
    });
    setLiveItems(liveItems => [].concat(...liveItems, ...arr));
    loading = false;
  }
};
  
const handleScroll = async () => {
  const liveDom :any = document.getElementById('zong_Content');
  const clientHeight = liveDom.clientHeight;
  const scrollTop = liveDom.scrollTop;
  const scrollHeight = liveDom.scrollHeight;
  if (scrollTop + clientHeight === scrollHeight) {
  	await loadData();
  }
};
  1. 那么第一次监听到滚动条到底部的时候,loading变量(全局)就会变为true
  2. 如果发生重复的底部监听动作(上述所说情况),loading变量为true,if判断不满足,不会发送第二次请求,什么也不做。
  3. 只有第一次请求处理完毕,loading变量才会变为false。才可以发起后续请求。

最终效果如下:
在这里插入图片描述
关注右侧的滚动条即可(由于是假数据,因此页面感官上不明显)。

到这里,瀑布流就实现完成了。你也可以在原来的基础上增加:

  • 瀑布流不能无限制往下拉,比如上面有100行数据的时候,就可以采用分页操作。参考斗鱼。
  • 分页后,就重新从瀑布最上方开始加载数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringSecurity Oauth2实战 - 04 自定义AuthProvider实现登录认证

文章目录1. 搭建资源服务器1. Token存储配置类 TokenStoreAutoConfiguration2. 资源服务器配置类 ResourceServerAutoConfiguration3. 在META-INF/spring.factories文件下添加配置类2. 搭建授权服务器1. 密码加密配置类 PasswordEncodeConfig2. RestTemplateConfig3. 授权服务器…

k3s 离线部署指南

文章目录1. 简介2. Docker 手动部署镜像方式2.1 安装docker2.2 导入镜像2.3 安装 k3s2.4 查看3. Containerd 手动部署镜像方式3.1 导入镜像到 containerd 镜像列表3.2 授予可执行权限3.3 安装 K3s4. Containerd 私有镜像仓库方式4.1 配置 K3s 镜像仓库4.2 授予可执行权限4.3…

集合(Set)和有序集合(ZSet)的基本使用方法详解【Redis】

文章目录一. Redis中的集合(Set)1.1基本的一些操作1.1.1 smembers查看集合中的所有成员1.1.2 scard删除成员数量1.1.3 smove移动成员1.1.4 sinterstore 存储俩个集合的交集二.Redis中的有序集合(ZSet)2.1 基本的一些操作2.1.1 zadd添加1到多个成员2.1.2 zcount 返回指定分数区间…

【HarmonyOS】鸿蒙轻量级智能穿戴应用可以集成华为分析SDK吗?

1、问题描述 我们的项目是基于鸿蒙系统开发的轻量级智能穿戴应用&#xff0c;目前在做的主要是运动手表GT3。 我们在项目中使用了华为分析服务&#xff0c;但是在Build Hap时出现问题&#xff1a; 因此&#xff0c;我们想了解轻量级智能穿戴应用项目中是否能够集成华为分析服…

计算机毕业设计(附源码)python在线影评系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Leetcode-每日一题1106. 解析布尔表达式(DFS模拟栈)

题目链接&#xff1a;点击跳转 思路 方法一、DFS模拟栈 题目意思很简单让你去判断与或非布尔表达式的结果&#xff0c;我们可以看布尔表达式看成一棵树&#xff0c;需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果&#xff0c;如图&#xff1a; 既然他是…

云栖大会开源重磅升级!PolarDB-X v2.2: 企业级和国产化适配

2022 年云栖大会上&#xff0c;PolarDB-X 发布 2.2.0 版本&#xff0c;这是一个重要的里程碑版本&#xff0c;重点推出符合分布式数据库金融标准下的企业级和国产化适配&#xff0c;共包括八大核心特性&#xff0c;全面提升 PolarDB-X 分布式数据库在金融、通讯、政务等行业的普…

自定义分页器

文章目录自定义分页器1、分页推导2、分页器代码封装自定义分页器 1、分页推导 queryset对象支持切片操作 确定用户访问的页码 url?page1 current_pagerequest.GET.get(page,1)前端获取到 的都是字符串数据&#xff0c;需要类型转换 current_page request.GET.get(page,…

为什么C语言执行效率高,运行快?

目录 简述C语言由来 BCPL语言及代码B语言以及代码C语言 编程语言 机器语言汇编语言高级语言 C为何快速 简述 都说C语言编写的程序执行效率比较高&#xff0c;那么到底高在哪里&#xff0c;我们一块来学习学习。 C语言由来 C语言源自于BCPL、B两种语言。 BCPL语言以及代码…

django csrfMiddleware的一些理解跨站和跨域

术语 术语解释备注跨域两个 URL 的“协议主机名端口”3者只要有一个不一致http://www.taobao.com/和https://www.taobao.com/跨站两个 URL 的 eTLD1 不相同a.github.io 和 b.github.ioeTLDeffective top level domain &#xff08;有效顶级域名&#xff09;.com、.co.uk、.git…

第六节:数组的定义与使用【java】

目录 &#x1f4c3;1. 数组的基本概念 1.1 为什么要使用数组 1.2 什么是数组 1.3 数组的创建及初始化 1.4 数组的使用 &#x1f392;2. 数组是引用类型 2.1 初始JVM的内存分布 2.2 基本类型变量与引用类型变量的区别 2.3 认识 null 2.4 再谈引用变量 &#x1f4d6;3. …

Redis的RDB持久化配置以及数据恢复

文章目录Redis的RDB持久化配置以及数据恢复配置RDB持久化机制RDB持久化机制的工作流程基于RDB持久化机制的数据恢复Redis的RDB持久化配置以及数据恢复 配置RDB持久化机制 在 redis 的配置文件中找到如下内容&#xff1a; 以 save 60 10000 为例&#xff0c;表示每隔 60s&…

Springboot 整合与文件配置

哈喽~大家好&#xff0c;这篇看看Springboot 整合与文件配置。 &#x1f947;个人主页&#xff1a;个人主页 &#x1f948; 系列专栏&#xff1a;【Java框架】 &#x1f949;与这篇相关的文章&#xff1a; 【JAVAEE框架】MyBatis与Spring的整合&#xff0…

Unity-huatuo热更新调研

文章目录1. 相关资料2. 环境准备2.1 项目和编辑器版本2.2 安装huatuo插件2.3 在build settings里面勾选Export Project2.4 导出Android studio工程3. 验证热更新3.1 更改读取目录3.2 运行android apk3.3 热更新1. 相关资料 bilibili视频&#xff1a;https://www.bilibili.com/…

学院打卡第十四天

今天是一道困难题&#xff0c;难得有困难题&#xff01;&#xff01; 如题&#xff1a; 但是这个困难题感觉也不是很”困难“&#xff01;&#xff01;&#xff01; 算法思想&#xff1a; 第一感觉就是利用栈的思想&#xff0c;这种题做多了&#xff0c;一看见就是想到栈&…

2021年上半年软件设计师下午真题及答案解析(三)

阅读下列说明和图&#xff0c;回答问题1至问题3&#xff0c;将解答填入答题纸的对应栏内。 【说明】 某中医医院拟开发一套线上抓药APP&#xff0c;允许患者凭借该医院医生开具的处方线上抓药&#xff0c;并提供免费送药上门服务。该系统的主要功能描述如下&#xff1a; &#…

Kotlin编程实战——概述(01)

一 概述 Kotlin用于服务器开发Kotlin 进行 Android 开发Kotlin 用于 JavaScript 开发Kotlin 用于原生开发Kotlin 用于数据科学协程多平台 二 Kotlin用于服务器开发 2.1 原因 表现力可伸缩性互操作性迁移迁移工具学习曲线 2.2 Kotlin 进行服务器端开发的框架 Spring、Vert.…

Premiere 出现“该级别的帧大小/帧速率无效。请减小视频范围或帧速率,或者增加配置文件和级别,然后重试”的解决办法

有时候我们需要制作一定纵横比的视频&#xff0c;比如设置画面大小为1080(水平)1920(垂直)的竖屏尺寸&#xff0c;但是最近我导出视频时发现了 “该级别的帧大小/帧速率无效。请减小视频范围或帧速率&#xff0c;或者增加配置文件和级别&#xff0c;然后重试” 这个问题&#x…

使用插值法公式组成数字电路进行计算的计算机

使用插值法公式组成数字电路进行计算的计算机 使用插值法公式组成数字电路进行计算的计算机是一种可以使用插值法计算积分值&#xff0c;导数值&#xff0c;函数值的数字计算机&#xff0c;它由按键&#xff0c;液晶显示器&#xff0c;中央处理器组成。按键输入的程序保存在磁带…

【CUDA编程】CUDA内存模型

文章目录1. 内存结构2. GPU device内存2.1 寄存器(Registers)2.2 本地内存(Local Memory)2.3 共享内存(Shared Memory)2.4 常量内存(Constant Memory)2.5 纹理内存(Texture Memory)2.6 全局内存(Global Memory)3. CPU Host内存1. 内存结构 在CUDA中可编程内存的类型有&#xf…