虚拟滚动;懒加载;高并发组件
虚拟滚动的实现
思路:它只渲染当前可视区域内的元素,而不是整个列表,滚动时计算出应该显示哪些元素
原生JS
class VirtualScroll {constructor(container, items, itemHeight, renderItem) {this.container = container;this.items = items;this.itemHeight = itemHeight;this.renderItem = renderItem;this.visibleItemCount = Math.ceil(container.clientHeight / itemHeight);this.totalHeight = items.length * itemHeight;this.init();}init() {// 设置容器高度以保持正确滚动条this.container.style.height = `${this.totalHeight}px`;// 创建内容容器this.content = document.createElement('div');this.container.appendChild(this.content);// 初始渲染this.render();// 添加滚动事件监听this.container.addEventListener('scroll', () => this.render());}render() {const scrollTop = this.container.scrollTop;const startIndex = Math.floor(scrollTop / this.itemHeight);const endIndex = Math.min(startIndex + this.visibleItemCount + 1, // +1 防止滚动时出现空白this.items.length);// 计算内容偏移量const offsetY = startIndex * this.itemHeight;// 渲染可见项let html = '';for (let i = startIndex; i < endIndex; i++) {html += this.renderItem(this.items[i], i);}this.content.innerHTML = html;this.content.style.transform = `translateY(${offsetY}px)`;}
}// 使用示例
const container = document.getElementById('scroll-container');
const items = Array.from({ length: 10000 }, (_, i) => `Item ${i + 1}`);
const itemHeight = 50;const virtualScroll = new VirtualScroll(container,items,itemHeight,(item, index) => `<div style="height: ${itemHeight}px; border-bottom: 1px solid #eee;">${item}</div>`
);
vue
<template><RecycleScrollerclass="scroller":items="items":item-size="50"key-field="id"v-slot="{ item }"><div class="item">{{ item.text }}</div></RecycleScroller>
</template><script>
import { RecycleScroller } from 'vue-virtual-scroller';
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';export default {components: {RecycleScroller},data() {return {items: Array.from({ length: 10000 }, (_, i) => ({id: i,text: `Item ${i + 1}`}))};}
};
</script><style>
.scroller {height: 500px;
}
.item {height: 50px;border-bottom: 1px solid #eee;
}
</style>
懒加载的实现
原理:延迟加载,例如图片:第一次只显示10张,滚动时请求显示20张,累加的
图片懒加载实现
原生JS
1. 使用原生HTML loading="lazy"属性
<img src="placeholder.jpg" data-src="actual-image.jpg" loading="lazy" alt="示例图片">
2. 使用Intersection Observer API
document.addEventListener("DOMContentLoaded", function() {const lazyImages = [].slice.call(document.querySelectorAll("img.lazy"));if ("IntersectionObserver" in window) {const lazyImageObserver = new IntersectionObserver(function(entries, observer) {entries.forEach(function(entry) {if (entry.isIntersecting) {const lazyImage = entry.target;lazyImage.src = lazyImage.dataset.src;lazyImage.classList.remove("lazy");lazyImageObserver.unobserve(lazyImage);}});});lazyImages.forEach(function(lazyImage) {lazyImageObserver.observe(lazyImage);});} else {// 回退方案lazyImages.forEach(function(lazyImage) {lazyImage.src = lazyImage.dataset.src;});}
});
3. 滚动事件监听实现(兼容旧浏览器)
function lazyLoad() {const images = document.querySelectorAll('img[data-src]');const windowHeight = window.innerHeight;images.forEach(img => {const imgTop = img.getBoundingClientRect().top;if (imgTop < windowHeight + 100) { // 提前100px加载img.src = img.dataset.src;img.removeAttribute('data-src');}});
}// 初始加载
lazyLoad();// 滚动事件节流
window.addEventListener('scroll', throttle(lazyLoad, 200));function throttle(func, wait) {let timeout;return function() {if (!timeout) {timeout = setTimeout(() => {func();timeout = null;}, wait);}};
}
vue
1.使用动态导入
const LazyComponent = () => import('./HeavyComponent.vue');new Vue({components: {LazyComponent}
});2. 结合路由的懒加载
const router = new VueRouter({routes: [{path: '/heavy',component: () => import('./views/HeavyView.vue')}]
});3. 基于视口的组件懒加载
<template><div ref="container"><component v-if="isVisible" :is="loadedComponent" /><div v-else>加载中...</div></div>
</template><script>
export default {props: {component: {type: Promise,required: true}},data() {return {isVisible: false,loadedComponent: null};},mounted() {const observer = new IntersectionObserver(([entry]) => {if (entry.isIntersecting) {this.loadComponent();observer.unobserve(this.$refs.container);}},{ threshold: 0.1 });observer.observe(this.$refs.container);},methods: {async loadComponent() {this.loadedComponent = (await this.component).default;this.isVisible = true;}}
};
</script>
高并发组件
相关文章:
虚拟滚动;懒加载;高并发组件
虚拟滚动的实现 思路:它只渲染当前可视区域内的元素,而不是整个列表,滚动时计算出应该显示哪些元素 原生JS class VirtualScroll {constructor(container, items, itemHeight, renderItem) {this.container container;this.items items;t…...

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
作者: Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位: 1 ^{1} 1乔治梅森大学计算机科学系, 2 ^{2} 2美国陆军研究实验室&…...

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互 前言一、JDBC 核心接口和类:数据库连接的“工具箱”1. 常用的 2 个“关键类”2. 必须掌握的 5 个“核心接口” 二、创建 JDBC 程序的步骤1. 第一步…...

数据库未正常关闭后,再次启动时只有主进程,数据库日志无输出
瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台:银河麒麟svs(X86_64) 版本:4.5.8 症状 现象:使用pg_ctl stop停止数据库,未正常关闭;使用pg_ctl stop -m i 强制关闭数据库后&…...
【信息系统项目管理师】高分论文:论成本管理与采购管理(信用管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划成本管理2、成本估算3、成本预算4、成本控制论文 2019年1月,我作为项目经理参与了 XX基金管理有限公司信用管理系统项目。该项目成 本1000万,建设期为1年。通过该项目,XX基金管理有限公司在信用…...

Oracle Recovery Tools修复ORA-00742、ORA-600 ktbair2: illegal inheritance故障
接到客户反馈,一套运行在虚拟化平台中的Oracle数据库,由于机房断电,导致数据库无法启动,最初启动报错 2025-04-22T16:59:48.92222708:00 Completed: alter database mount exclusive alter database open 2025-04-22T16:59:52.60972608:00 Ping without log force is disabled:…...

基于 Netmiko 的网络设备自动化操作
学习目标 掌握 Netmiko 库的核心功能与使用场景。能够通过 Netmiko 连接多厂商设备并执行命令和配置。实现批量设备管理、配置备份与自动化巡检。掌握异常处理、日志记录与性能优化技巧。理解 Netmiko 在自动化运维体系中的角色。 1. Netmiko 简介 1.1 什么是 Netmiko Netmi…...
玉米产量遥感估产系统的开发实践(持续迭代与更新)
项目地址:项目首页 - maize_yield_estimation:玉米估产的flaskvue项目 - GitCode 开发中,敬请期待。。。 以下是预先写的提纲,准备慢慢补充 一、项目背景与工程目标 业务需求分析 农业遥感估产的行业痛点(数据分散、模型精度不足…...

LeNet5 神经网络的参数解析和图片尺寸解析
1.LeNet-5 神经网络 以下是针对 LeNet-5 神经网络的详细参数解析和图片尺寸变化分析,和原始论文设计,通过分步计算说明各层的张量变换过程。 经典的 LeNet-5架构简化版(原始论文输入为 32x32,MNIST 常用 28x28 需调整)…...

Axure大屏可视化模板:多领域数据决策的新引擎
在数据驱动决策的时代,Axure大屏可视化模板凭借交互性与可定制性,成为农业、园区管理、智慧城市、企业及医疗领域的创新工具,助力高效数据展示与智能决策。 核心应用场景 1. 农业精细化:实时监控土壤湿度、作物生长曲线&#x…...
大内存生产环境tomcat-jvm配置实践
话不多讲,奉上代码,分享经验,交流提高! 64G物理内存,8核CPU生产环境tomcat-jvm配置如下: JAVA_OPTS-server -XX:MaxMetaspaceSize4G -XX:ReservedCodeCacheSize2G -XX:UseG1GC -Xms48G -Xmx48G -XX:MaxGCPauseMilli…...
APP和小程序需要注册域名吗?(国科云)
在移动互联网时代,APP和小程序已成为企业和个人提供服务、展示产品的重要渠道。那么APP和小程序的兴起是否对域名造成了冲击,APP和小程序是否需要注册域名呢? APP是否需要注册域名? 从技术上讲,没有域名的APP仍然可以…...

代码随想录算法训练营第60期第十七天打卡
今天我们继续进入二叉树的下一个章节,今天的内容我在写今天的博客前大致看了一下部分题目难度不算大,那我们就进入今天的题目。 第一题对应力扣编号为654的题目最大二叉树 这道题目的坑相当多,我第一次题目没有看明白就是我不知道到底是如何…...
小刚说C语言刷题——1565成绩(score)
1.题目描述 牛牛最近学习了 C 入门课程,这门课程的总成绩计算方法是: 总成绩作业成绩 20% 小测成绩 30% 期末考试成绩 50%。 牛牛想知道,这门课程自己最终能得到多少分。 输入 三个非负整数 A、B、C ,分别表示牛牛的作业成…...

SOC估算:开路电压修正的安时积分法
SOC估算:开路电压修正的安时积分法 基本概念 开路电压修正的安时积分法是一种结合了两种SOC估算方法的混合技术: 安时积分法(库仑计数法) - 通过电流积分计算SOC变化 开路电压法 - 通过电池电压与SOC的关系曲线进行校准 方法原…...
Spark-SQL(总结)
了解到Spark SQL是Spark用于结构化数据处理的模块,其前身是Shark。Shark基于Hive开发,但对Hive的依赖制约了Spark的发展。掌握了 Spark - SQL 的特点,如易整合、统一数据访问、兼容 Hive 以及支持标准数据连接,可处理多种数据源的…...
Oracle for Linux安装和配置(11)——Oracle安装和配置
11.3. Oracle安装和配置 Linux上Oracle的安装及配置与Windows上差不多,只是安装软件的准备等有所不同,下面只对不同于Windows的部分进行较为详细的讲解,其他类似部分不再赘述。另外,无论选择使用虚机还是物理机,Oracle安装、配置和使用等方面几乎都是完全一样的。 11.3.…...
【防火墙 pfsense】2配置
(1)接口配置和接口 IP 地址分配 ->配置广域网(WAN)和局域网(LAN)接口,分配设备标识符,如 eth0、eth1 等; ->如将WAN 接口将被分配到 eth0,而 LAN 接口将…...

使用 SSE + WebFlux 推送日志信息到前端
为什么使用 SSE 而不使用 WebSocket, 请看 SEE 对比 Websocket 的优缺点。 特性SSEWebSocket通信方向单向(服务器→客户端)双向(全双工)协议基于 HTTP独立协议(需 ws:// 前缀)兼容性现代浏览器(…...
Ollama 常见命令速览:本地大模型管理指南
Ollama 常见命令速览:本地大模型管理指南 一、什么是 Ollama? Ollama 是一个轻量级工具,允许用户在本地快速部署和运行大型语言模型(LLM),如 Llama、DeepSeek、CodeLlama 等。其命令行工具设计简洁&#…...
C++开发之设计模式
设计模式存在的意义 设计模式提供了经过验证的解决方案,帮助开发者在不同的项目中重用这些解决方法,减少重复劳动,提高代码的复用性。设计模式通常遵循面向对象的设计原则,如单一职责原则、开放封闭原则等,能够帮助开…...
AWS Glue ETL设计与调度最佳实践
一、引言 在AWS Glue中设计和调度ETL过程时,需结合其无服务器架构和托管服务特性,采用系统化方法和最佳实践,以提高效率、可靠性和可维护性。本文将从调度策略和设计方法两大维度详细论述,并辅以实际案例说明。 二、调度策略的最…...

二叉树的遍历(广度优先搜索)
二叉树的第二种遍历方式,层序遍历,本质是运用队列对二叉树进行搜索。 层序遍历是指将二叉树的每一层按顺序遍历,通过队列实现就是先将根节点push入队,统计此时的队列中的元素数量size,将size元素全部pop出去࿰…...
JavaScript 里创建对象
咱们来用有趣的方式探索一下 JavaScript 里创建对象的各种“魔法咒语”! 想象一下,你是一位魔法工匠,想要在你的代码世界里创造各种奇妙的“魔法物品”(也就是对象)。你有好几种不同的配方和工具: 1. 随手捏造(对象字面量 {}) 场景:你想快速做一个独一无二的小玩意儿…...

2025年计算机视觉与智能通信国际会议(ICCVIC 2025)
2025 International Conference on Computer Vision and Intelligent Communication 一、大会信息 会议简称:ICCVIC 2025 大会地点:中国杭州 收录检索:提交Ei Compendex,CPCI,CNKI,Google Scholar等 二、会议简介 2025年计算机视觉与智能通…...

手工收集统计信息
有时想对某些表收集统计信息 CREATE OR REPLACE PROCEDURE GATHER_STATS ASDECLAREV_SQL1 VARCHAR(1000);--表游标CURSOR C1 ISSELECT (SELECT USER) AS TABLE_OWNER,TABLE_NAMEFROM USER_TABLES; --可以在这里加过滤条件--索引游标CURSOR C2 ISSELECT TABLE_OWNER,INDEX_NAM…...

flume整合Kafka和spark-streaming核心编程
flume整合Kafka 需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 1.查看topic 2.编辑flume-Kafka.conf,并启动flume 3.启动Kafka消费者 4.新增测试数据 5.查…...
tokenizer的用法
下面介绍下基于 Hugging Face Transformers 库中 tokenizer(分词器)的主要用法和常用方法,帮助你了解如何在各种场景下处理文本。这里以 AutoTokenizer 为例,但大多数模型对应的 tokenizer 用法大同小异。 ───────────…...
kotlin和MVVM的结合使用总结(二)
MVVM 架构详解 核心组件:ViewModel 和 LiveData 在 Android 中,MVVM 架构主要借助 ViewModel 和 LiveData 来实现。ViewModel 负责处理业务逻辑,而 LiveData 则用于实现数据的响应式更新。 ViewModel 的源码分析 ViewModel 的核心逻辑在 …...
Git 入门知识详解
文章目录 一、Git 是什么1、Git 简介2、Git 的诞生3、集中式 vs 分布式3.1 集中式版本控制系统3.2 分布式版本控制系统 二、GitHub 与 Git 安装1、GitHub2、Git 安装 一、Git 是什么 1、Git 简介 Git 是目前世界上最先进的分布式版本控制系统。版本控制系统能帮助我们更好地管…...