前端滚动分页

news2024/11/28 1:48:55

场景

在前端开发中,我们经常碰到分页加载的需求,在PC端通常用分页组件就可以解决这种类型的场景。而当我们在移动端中,分页组件就显得有点不符合逻辑和正常的交互体验,所以滚动分页常常成为我们的一种选择,即页面滚动到底部时才能加载更多数据,以免一次加载太多数据造成性能问题。

关于滚动分页,其实还是存在一些不好处理的问题需要我们一一解决,往往想要实现符合需求的交互和良好的用户体验并不是那么轻易。因此需要将滚动分页做成可复用易维护的模块,以提高效率。
在这里插入图片描述

功能分析

首先,滚动分页根据不同的操作,需要渲染不同的状态的页面视图:
在这里插入图片描述
滚动分页视图对应了多个状态,有状态自然会有状态机。状态机的变化请看如下流程图:

在这里插入图片描述
上图的其中一个关键点是,需要根据分页的后台接口请求的请求前、请求中和请求后三个阶段的状态渲染不同的视图。 另外一个关键点是,涉及到的用户操作有两个:

初始化时,触发第一次远程数据加载
滚动到底部时,触发远程数据加载

实现

1、常规的实现方案,监听滚动事件,判断页面滚动距离和窗口大小,距离顶部位置的高度,根据判断生成下一组数据并插入,直至数据量为空。
在这里插入图片描述
2.可以在页面的最底部加一条横线,当视图滚过横线之时,则需要添加数据,重复这样的操作,直至数据为空即可。

大致的逻辑类似以下代码,根据判断横线dom是否在区域内判断是否请求数据。

if (entries[0].intersectionRatio > 0) {
console.log('进入可视区域');
// do something
} else {
console.log('移出可视区域');
// do something
}
});

性能优化

使用了窗口的滚动事件会对浏览器或者程序运行载体有一定的性能影响,如果导致页面卡顿的情况,我们可以通过使用防抖和节流,减少对页面滚动的监听频率。

防抖:

实现原理:定义一个计时器,规定delay时间内触发则重置计时器,延迟时间根据需求制定。

应用场景:(就举一个跟它名字比较切合的例子吧)点击按钮,手抖了,误点了两下,事件重复触发!!为了防止出现这个局面,我们的防抖就可以派上用场了。

/**
 * 防抖函数
 * @param {*} event 触发的事件
 * @param {*} delay 延迟时间
 * @return {*} function 闭包
 */
function deBounce (event, delay) {
    let timeOut = null
    // 闭包缓存timeout
    return () => {
        // 若timeout存在则重置
        if (timeOut) {
            clearTimeout(timeOut)
        }
        timeOut = setTimeout(event, delay)
    }
}

节流:

实现原理:定义一个计时器,控制阀门的开关,必须经过一定的时间后才可以重新触发事件。

应用场景:滚动事件,窗口resize事件等各种高频率触发的事件,大都可以用节流来降低其频率。

/**
 * 节流函数
 * @param {*} event 触发的事件
 * @param {*} delay 水阀打开的时间
 * @return {*}
 */
 function throttle (event, delay) {
    let flag = true
    // 闭包缓存数据
    return () => {
        // 水阀关闭,不触发任何事件
        if (!flag) {
            return false
        } else {
            // 触发事件一次后,将水阀关闭
            event()
            flag = false
            // 控制水阀在延迟多久后会重新打开
            setTimeout(() => {
                flag = true
            }, delay)
        }
    }
    /* 请注意,节流函数并不止上面这种实现方案,
   例如可以完全不借助setTimeout,可以把状态位换成时间戳,然后利用时间戳差值是否大于指定间隔时间来做判定。
   也可以直接将setTimeout的返回的标记当做判断条件-判断当前定时器是否存在,如果存在表示还在冷却,并且在执行fn之后消除定时器表示激活,原理都一样
    *
}

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

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

相关文章

PostgreSQL空间地理信息postGis

PostgreSQL 数据库 PostgreSQL有各种各样的插件扩展其功能,其中地理信息有PostGis插件的支持,丰富PostgreSQL 数据库的使用功能。因此PostgreSQL 结合PostGis可以存储Geometry类型数据的点、线、面等数据,同时还可以结合相应的专有函数做空间…

听GPT 讲Rust源代码--library/std(11)

题图来自 Features of Rust[1] File: rust/library/std/src/sys/itron/time.rs 在Rust源代码中,rust/library/std/src/sys/itron/time.rs文件是用于实现与ITRON操作系统相关的时间功能。ITRON是一种实时操作系统,被广泛用于嵌入式系统中。这个文件中定义…

ps5计时计费管理系统软件怎么使用教学,佳易王PS5体验馆计时收费管理倒计时提醒软件试用下载

ps5计时计费管理系统软件怎么使用教学,佳易王PS5体验馆计时收费管理倒计时提醒软件试用下载 每台机子可以自由设置倒计时提醒的时间,到了时间后,电脑会发出语音提醒同时改变颜色双重提醒方式。也可以在中途关闭提醒或更改提醒时间。每个机子可…

Pycharm安装配置Pyqt5教程(保姆级)

目录 一、前言 1、依赖包 2、工具 二、安装依赖包 三、配置环境 四、配置设计工具 1、Qt Designer 2、PyRcc 3、PyUIC 五、使用 1、界面设计 2、ui文件转化为py文件 一、前言 很多情况下需要为程序设计一个GUI界面,在Python中使用较多的用户界面设计工具…

图像新型拼接

道路摄像头拼接 拼接道路上的摄像头,比较麻烦,如图所示 前后的摄像头都是如此,那么如何拼接摄像头画面呢,像下面这样拼接 测试代码 测试一下代码,使用python import cv2 import numpy as npimg cv2.imread("…

python 成绩统计,输出及格率和优秀率

题目描述: 小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。 如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。 请计算及格率和优秀率,用百分数表示&am…

【算法训练营】最近公共祖先+求最大连续bit数

算法 1.最近公共祖先求最大连续bit数 1.最近公共祖先 题目链接 【题目解析】: 最近公共祖先表示距离两个节点最近的公共父节点,这道题考察二叉树。【解题思路】: 题目所描述的满二叉树如下: 1 / \ 2 3 / \ / \ 4 5 6 7 上述树中…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义,两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业…

25.3 MySQL 多表查询

1. 排序 ORDER BY子句用于对查询结果进行排序. 它可以按照一个或多个列的值进行升序或降序排序.在SELECT语句中, ORDER BY子句应该位于结尾, 其基本语法如下: SELECT 字段1, 字段2, ... FROM 表名 ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC], ...其中, ASC(ascend): 表…

ardupilot开发 --- gdb 篇

环境 win11 vscode 1.81.0 wsl2 ardupilot 利用gdb工具在vsCode中实现 Ardupilot SITL的断点调试 优点:可在vsCode中实现断点调试。 参考文献:https://ardupilot.org/dev/docs/debugging-with-gdb-using-vscode.html 安装gdb工具 打开wsl&#xff0…

项目实战:新增@Controller和@Service@Repository@Autowire四个注解

1、Controller package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface Controller { }2、Service package com.csdn.mymvc.annotation; import java.lang.annotation.*…

文献阅读:LONGNET: Scaling Transformers to 1,000,000,000 Tokens

文献阅读:LONGNET: Scaling Transformers to 1,000,000,000 Tokens 1. 文章简介2. 方法原理 1. 方法思路2. Dilated Attention 1. 具体原理2. 多头实现3. 复杂度分析 3. 训练方法 3. 实验结果4. 结论 & 思考5. 参考链接 文献链接:https://arxiv.org…

onlyoffice 去除:连接器(connector) 表单填(Filling out the form)限制 可使用jsApi级别操作文档

阅读须知:本文针对有对word/excel进行js操作的需求 本次改造基于V7.3.3进行,已经更新进入docker。 小伙伴们须知:改造后的office docker需要付费(875元),等于wps一个月费用 欢迎大家一起交流:V&…

pycharm插件推荐:一款能够根据上下文自动提示帮写代码的AI插件

直接上插件: 这个插件有多牛!他能够根据注释帮你直接补全代码(只需要你按一下tab键),甚至还有学习的能力。 如下: 我注释写完后,一回车就模糊的写出了预计的代码,只要我按下tab键…

【Head First 设计模式】-- 策略模式

一、背景 Head First 设计模式第一章设计模式入门–策略模式 二、工具箱的工具(本章) 1、OO基础 封装 继承 多态 抽象 2、OO原则 封装变化 面向接口编程,而非面向实现编程 组合优于继承 3、OO模式 策略模式,所谓策略模式就是定义…

基于STM32HAL库(窗口看门狗)-简述

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 一个成熟靠谱的项目,离不开“看门狗”的必选项,凡是人写的程序多少都会有出现bug的情况(或芯片外设受外界干扰导致故障程序卡死、跑飞的情况&#xf…

中国多主数据库:压强投入,期待破茧

拿破仑曾说:“战争的艺术就是在某一点上集中最大优势兵力”,强调了力量集中的重要性。 如今,国际形势风云变幻,西方世界对中国的围剿不再仅仅体现在军事和地缘政治上,而更多表现在经济与科技上。在科技领域&#xff0…

小程序制作(超详解!!!)第十二节 循环求和计算器

1.index.wxml <view class"box"><view class"title">利用循环语句求和</view><view><input placeholder"请输入起点数值" type"number" bindblur"starNum"></input><!--一旦失去交…

JavaEE-部署项目到服务器

本部分内容为&#xff1a;安装依赖&#xff1a;JDK&#xff0c;Tomcat&#xff0c;Mysql&#xff1b;部署项目到服务器 什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器&#xff0c;底层是Socket的一个程序&#xff0c;它也是JSP和Serlvet的一个容器。 为什么我们需要…

【Docker】Docker中 的AUFS、BTRFS、ZFS、存储池概念的详细讲解

前言 作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&…