WEB:如何优化大数据菜单展示的攻略指南

1、简述

在前端开发中,树结构菜单是常见的 UI 组件,尤其是在展示层级复杂、数据量庞大的场景下。如何优化大数据量的树结构菜单展示,提高性能和用户体验,是一个值得探讨的话题。本文将介绍一些优化技术和实践,帮助开发者有效处理大数据量的树结构菜单展示。

在这里插入图片描述

2、问题分析

当树结构的数据量非常大时,可能会遇到以下问题:

  • 初始加载时间过长:一次性加载所有节点会导致页面渲染速度变慢。
  • 内存消耗过高:大量节点同时存在于 DOM 中,内存占用过高,影响性能。
  • 操作卡顿:展开、折叠等操作响应速度慢,影响用户体验。

为了解决这些问题,可以从以下几个方面进行优化。

3、优化方案

3.1 懒加载(Lazy Loading)

懒加载是一种按需加载数据的技术,即只在用户需要时才加载相应的数据。对于树结构菜单,可以在节点展开时再加载其子节点。

// 示例:使用递归异步加载子节点
const loadData = async (node) => {if (node.children && node.children.length > 0) {// 已经加载过子节点return;}// 异步加载子节点数据node.loading = true;const children = await fetchChildren(node.id);node.children = children;node.loading = false;
};// 异步获取子节点数据
const fetchChildren = async (parentId) => {const response = await fetch(`/api/nodes?parentId=${parentId}`);const data = await response.json();return data;
};
3.2 虚拟滚动(Virtual Scrolling)

虚拟滚动是一种只渲染可见区域节点的技术,可以大幅减少渲染的 DOM 节点数,从而提高性能。

// 示例:使用react-virtualized实现虚拟滚动
import { Tree, AutoSizer, List } from 'react-virtualized';const VirtualizedTree = ({ nodes }) => {const rowRenderer = ({ key, index, style }) => {const node = nodes[index];return (<div key={key} style={style}>{node.name}</div>);};return (<AutoSizer>{({ height, width }) => (<Listheight={height}width={width}rowCount={nodes.length}rowHeight={30}rowRenderer={rowRenderer}/>)}</AutoSizer>);
};
3.3 按需渲染(Conditional Rendering)

对于初始不展示的节点,可以通过条件渲染来减少初始渲染的节点数量。

const renderNode = (node) => {return (<div><div onClick={() => toggleNode(node)}>{node.name}</div>{node.isExpanded && node.children && (<div>{node.children.map(child => renderNode(child))}</div>)}</div>);
};const toggleNode = (node) => {node.isExpanded = !node.isExpanded;if (node.isExpanded && !node.children) {loadData(node);}
};
3.4 使用高效的数据结构

选择高效的数据结构存储和操作树节点数据,可以提高操作效率。推荐使用 Map 代替 Object 存储节点数据,避免深层嵌套和重复遍历。

// 示例:使用 Map 存储节点数据
const nodeMap = new Map();const addNode = (node) => {nodeMap.set(node.id, node);
};const getNode = (id) => {return nodeMap.get(id);
};
3.5 优化事件处理

避免在树节点上绑定大量事件处理函数,可以通过事件委托来优化事件处理。

const treeContainer = document.getElementById('tree-container');treeContainer.addEventListener('click', (event) => {const nodeId = event.target.getAttribute('data-node-id');if (nodeId) {const node = getNode(nodeId);toggleNode(node);}
});

4、综合示例

下面是一个综合示例,展示如何结合以上优化方案,构建一个高效的大数据量树结构菜单展示:

import React, { useState, useEffect } from 'react';
import { AutoSizer, List } from 'react-virtualized';
import 'react-virtualized/styles.css';const TreeNode = ({ node, loadData }) => {const [isExpanded, setIsExpanded] = useState(false);const [children, setChildren] = useState(node.children || []);const handleToggle = async () => {if (!isExpanded && children.length === 0) {const data = await loadData(node.id);setChildren(data);}setIsExpanded(!isExpanded);};return (<div><div onClick={handleToggle}>{node.name}</div>{isExpanded && (<div style={{ paddingLeft: '20px' }}>{children.map(child => (<TreeNode key={child.id} node={child} loadData={loadData} />))}</div>)}</div>);
};const VirtualizedTree = ({ nodes, loadData }) => {const rowRenderer = ({ key, index, style }) => {const node = nodes[index];return (<div key={key} style={style}><TreeNode node={node} loadData={loadData} /></div>);};return (<AutoSizer>{({ height, width }) => (<Listheight={height}width={width}rowCount={nodes.length}rowHeight={30}rowRenderer={rowRenderer}/>)}</AutoSizer>);
};const App = () => {const [nodes, setNodes] = useState([]);useEffect(() => {// 初始加载根节点数据const loadRootNodes = async () => {const response = await fetch('/api/root-nodes');const data = await response.json();setNodes(data);};loadRootNodes();}, []);const loadData = async (parentId) => {const response = await fetch(`/api/nodes?parentId=${parentId}`);const data = await response.json();return data;};return (<div style={{ height: '100vh' }}><VirtualizedTree nodes={nodes} loadData={loadData} /></div>);
};export default App;

5、总结

优化大数据量的树结构菜单展示,可以通过懒加载、虚拟滚动、按需渲染、使用高效的数据结构以及优化事件处理等方法来提高性能和用户体验。通过这些优化技术,开发者可以有效地处理和展示复杂的大数据量树结构菜单,确保前端应用的高效运行。

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

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

相关文章

MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷&#xff0c;等到把数据表的删除说完咱们统一&#xff0c;总结书写 1.数据表的删除&#xff1a; 语法&#xff1a; 1. 使用 DROP TABLE 语句删除单个表 基本语法&#xff1a;DROP TABLE [IF EXISTS] table_name; table_name是要删除的表的名称。IF EXIS…

【每日推荐】使用 Ollama 平台上的 Llama 3.2-vision 模型进行视频目标检测

&#x1f680; 使用 Ollama 平台上的 Llama 3.2-vision 模型进行视频目标检测 在本期推荐的文章中&#xff0c;视频将展示如何通过 Ollama 平台上的 Llama 3.2-vision 多模态模型&#xff0c;结合 Python 和 FastAPI 框架&#xff0c;轻松实现视频目标检测功能。只需要简单的代…

【华为云-云驻共创】UCS跨云多活容灾:让业务高可用不再是难题

【摘要】云原生应用深入到企业各个业务场景&#xff0c;云原生正在走向分布式化&#xff0c;跨云跨域统一协同治理&#xff0c;保证一致应用体验&#xff0c;这些新的需求日益凸显。而容灾是确保服务高可用的保障&#xff0c;但即使应用部署在云上&#xff0c;也无法避免市政方…

ssm080削面快餐店点餐服务系统的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;快餐店点餐服务系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本快餐店点餐服务…

AI学习笔记

目录 专业词汇 AI、NLP和AIGC的关系 涌现能力(Emergent Ability) 专业词汇 专业词汇 (缩写) 英文中文AIArtificial Intelligence人工智能AIGCArtificial Intelligence Generated Content人工智能生成内容PGCProfessional Generated Content专业生成内容UGCUser Generated Co…

【【简单systyem verilog 语言学习使用二--- 新adder加法器 】】

【【简单systyem verilog 语言学习使用二— 新adder加法器 】】 adder.v module addernew(input clk ,input rst_n ,input [2 : 0] in_a ,input [2 : 0] in_b ,input …

曲率定义与三维Mesh曲率估计

曲率定义与三维Mesh曲率估计 二维圆的曲率线的曲率 三维Patch fitting methodsNormal curvature-based methodsTensor averaging methods Estimating Curvatures and Their Derivatives on Triangle Meshes1. Per-Face Curvature Computation2. Coordinate System Transformati…

Dinky控制台:利用SSE技术实现实时日志监控与操作

1、前置知识 1.1 Dinky介绍 实时即未来,Dinky 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。 Dinky 是一个开箱即用、易扩展,以 Apache Flink 为基础,连接 OLAP 和数据湖等众多框架的一站式实时计算平台,致力于流批一体和湖仓一体的探索与实践。 致力于简化Flink任务开…

无人机声学侦测算法详解!

一、算法原理 无人机在飞行过程中&#xff0c;其电机工作、旋翼震动以及气流扰动等都会产生一定程度的噪声。这些噪声具有独特的声学特征&#xff0c;如频率范围、时域和频域特性等&#xff0c;可以用于无人机的检测与识别。声学侦测算法利用这些特征&#xff0c;通过一系列步…

ABAP开发-12、Dialog屏幕开发_1

系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、Dialog屏幕概览二、界面1、界面-界面中的事件块2、界面-创建界面3、界面- 属性4、界面-元素清单5、界面-Screen Layout Designer6、界面- 参照创建7、界面- 常用关键字8、界面- 数据处理逻辑9、界面- Module执行顺序…

vue搭建项目之后的步骤操作

1.创建router文件夹&#xff08;里面创建index.js&#xff09;&#xff0c;创建views文件夹&#xff08;创建index页面&#xff09; 2.删除assets文件夹里面的内容&#xff0c;删除components文件夹 3.安装路由 npm install vue-router 4.router路由下面的index.js书写内容 …

w029基于springboot的网上购物商城系统研发

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

底层视角看C语言

文章目录 main函数很普通main函数之前调用了什么main函数和自定义函数的对比 变量名只为人而存在goto是循环的本质指针变量指针是一个特殊的数字汇编层面看指针 数组和指针数组越界问题低端地址越界高端地址越界 引用就是指针 main函数很普通 main函数是第一个被调用的函数吗&…

Linux内核USB2.0驱动框架分析--USB设备枚举过程

一 USB特点 1.1 USB协议版本介绍&#xff1a; USB1.0/1.1&#xff08;low/fullspeed&#xff09;&#xff1a;传输速率最大为12Mbps&#xff0c;是较早的USB协议版本。 USB2.0&#xff08;highspeed&#xff09;&#xff1a;传输速率最大为480Mbps&#xff0c;相比USB1.0/1.1…

bert-base-uncased处理文档

1.安装必要的库 确保安装 transformers 和 torch 库&#xff1a; pip install transformers torch 2.加载本地 BERT 模型和分词器 由于已将模型和分词器下载到本地&#xff0c;可以指定文件路径加载。确保路径与本地文件结构一致。 from transformers import BertTokenizer…

【快速入门】Kafka的安装部署

目录 一、我的集群环境介绍 二、集群部署 1、解压安装包 2、修改解压后的文件名称 3、进入到/opt/installs/kafka3 目录&#xff0c;修改配置文件 4、分发安装包 5、分别在 bigdata02 和 bigdata03上修改配置文件 6、配置环境变量 7、启动集群 8、停止集群 三、本文用…

Windows安装tensorflow的GPU版本

前言 首先本文讨论的是windows系统&#xff0c;显卡是英伟达&#xff08;invida&#xff09;如何安装tensorflow-gpu。一共需要安装tensorflow-gpu、cuDNN、CUDA三个东西。其中CUDA是显卡的驱动库&#xff0c;cuDNN是深度学习加速库。 安装开始前&#xff0c;首先需要安装好c…

深度学习(神经网络)中模型的评估与性能度量

深度学习&#xff08;神经网络&#xff09;中模型的评估与性能度量 1.在现实任务中&#xff0c;我们往往有多种学习算法可供选择&#xff0c;那么我们如何评判一个模型的好坏呢&#xff1f;理想的解决方案是对模型的泛化误差进行评估&#xff0c;选择泛化误差最小的&#xff1…

mysql做数据统计图表常用的sql语句 部门人数 工龄 学历 年龄 性别 在职人员 兴趣分析查询

做统计有时候挺头疼的&#xff0c;sql改来改去还是达不到想要的效果&#xff0c;这里分享一下最近写的sql&#xff0c;感兴趣的朋友可以看看了解一下&#xff0c;sql语句代码都有注释。 这里只分享sql查询语句&#xff0c;前端图表用的是Echarts。 首先看一下统计的效果图 1、…

无人机之姿态融合算法篇

无人机的姿态融合算法是无人机飞行控制中的核心技术之一&#xff0c;它通过将来自不同传感器的数据进行融合&#xff0c;以实现更加精确、可靠的姿态检测。 一、传感器选择与数据预处理 无人机姿态融合算法通常依赖于多种传感器&#xff0c;包括加速度计、陀螺仪、磁力计等。这…