web前端之web前端

MENU

  • web前端之原生实现分时函数、分时间段渲染页面,而不是等到所有操作都执行结束才渲染页面、提高用户体验
  • web前端之原生实现树形目录结构、一维数组生成多维数组、无限级菜单目录


web前端之原生实现分时函数、分时间段渲染页面,而不是等到所有操作都执行结束才渲染页面、提高用户体验

前言

当前需要向页面插入十万个div元素,如果使用普通的渲染方式,会造成延迟。这时候就需要通过分时函数来实现渲染了。


html

<div class="w_680 d_f jc_sb"><div class="d_f fd_c ai_c"><button onclick="handleInsert()">插入1万个元素(原始写法)</button><div id="idOld"></div></div><div class="d_f fd_c ai_c"><button onclick="handleOptimize()">插入1万个元素(优化后的写法)</button><div id="idOptimize"></div></div>
</div>

原始写法

function handleInsert() {let idOld = document.querySelector('#idOld'),datas = Array.from({ length: 100000 }, (_, i) => i + 1);for (const item of datas) {const div = document.createElement('div');div.textContent = item;idOld.appendChild(div);}
}

优化方式一(参数归一化)

function handleOptimize() {let datas = Array.from({ length: 100000 }, (_, i) => i + 1),idOptimize = document.querySelector('#idOptimize'),taskHandler = (item, i) => {const div = document.createElement('div');div.textContent = item;idOptimize.appendChild(div);};performChunk(datas, taskHandler);// performChunk(100000, taskHandler);
}function performChunk(datas, taskHandler) {// 参数归一化if (typeof datas === 'number') datas = Array.from({ length: datas }, (_, i) => i + 1);if (datas.length === 0) return false;let i = 0;function _run() {if (i >= datas.length) return false;requestIdleCallback((idle) => {while (idle.timeRemaining() > 0 && i < datas.length) {taskHandler(datas[i], i);i++;}_run();});}_run();
}

优化方式二(当浏览器不支持requestIdleCallback方法的时候)

function handleOptimize() {let datas = Array.from({ length: 100000 }, (_, i) => i + 1),idOptimize = document.querySelector('#idOptimize'),taskHandler = (item, i) => {const div = document.createElement('div');div.textContent = item;idOptimize.appendChild(div);},scheduler = (task) => {setTimeout(() => {const start = Date.now();task(() => Date.now() - start < 50);}, 100);};performChunk(datas, taskHandler, scheduler);
}function performChunk(datas, taskHandler, scheduler) {if (typeof datas === 'number') datas = Array.from({ length: datas }, (_, i) => i + 1);if (datas.length === 0) return false;let i = 0;function _run() {if (i >= datas.length) return false;scheduler((isGoOn) => {while (isGoOn() > 0 && i < datas.length) {taskHandler(datas[i], i);i++;}_run();});}_run();
}

优化方式三(判断环境)

function handleOptimize() {let datas = Array.from({ length: 100000 }, (_, i) => i + 1),idOptimize = document.querySelector('#idOptimize'),taskHandler = (item, i) => {const div = document.createElement('div');div.textContent = item;idOptimize.appendChild(div);}browserPerformChunk(datas, taskHandler);
}function browserPerformChunk(datas, taskHandler) {const scheduler = (task) => {requestIdleCallback((idle) => {task(() => idle.timeRemaining() > 0);})};performChunk(datas, taskHandler, scheduler);
}function performChunk(datas, taskHandler, scheduler) {if (typeof datas === 'number') datas = Array.from({ length: datas }, (_, i) => i + 1);if (datas.length === 0) return false;let i = 0;function _run() {if (i >= datas.length) return false;scheduler((isGoOn) => {while (isGoOn() > 0 && i < datas.length) {taskHandler(datas[i], i);i++;}_run();});}_run();
}

解析

待定…


web前端之原生实现树形目录结构、一维数组生成多维数组、无限级菜单目录

html

<div id="menuBox"></div>

JavaScript

mainInit();// 数据处理
// 扁平数组结构转换成JSON树形结构
function mainInit() {// 源数据let data = [{ id: 5, parentId: 2, name: "目录1-1-1", },{ id: 1, parentId: 0, name: "目录1", },{ id: 13, parentId: 9, name: "目录2-2-3", },{ id: 3, parentId: 1, name: "目录1-2", },{ id: 2, parentId: 1, name: "目录1-1", },{ id: 12, parentId: 9, name: "目录2-2-2", },{ id: 4, parentId: 1, name: "目录1-3", },{ id: 7, parentId: 0, name: "目录2", },{ id: 9, parentId: 7, name: "目录2-2", },{ id: 6, parentId: 2, name: "目录1-1-2", },{ id: 11, parentId: 9, name: "目录2-2-1", },{ id: 8, parentId: 7, name: "目录2-1", },{ id: 10, parentId: 7, name: "目录2-3", },];// 构造一个新对象// 对象的属性名是id值// 对象的属性值是数组对应项的值let map = {};data.forEach(item => {map[item.id] = item;});const result = [];data.forEach(item => {const parent = map[item.parentId];if (parent) {// 如果有children则push数据到children中// 如果没有就新建一个空的children数组// 然后再push数据parent.children = parent.children || [];parent.children.push(item);} else {// 在本例中// else只会进入两次// 也是最外层目录result.push(item);}});const root = document.getElementById('menuBox');createMenu(result, root);
}// 生成标签元素
function createMenu(data, root) {if (!data.length) throw new Error('出错啦');data.forEach(item => {const detailsEle = document.createElement('details');const summaryEle = document.createElement('summary');const span = document.createElement('span');span.innerHTML = item.name;summaryEle.appendChild(span);detailsEle.appendChild(summaryEle);root.appendChild(detailsEle);if (item.children?.length) createMenu(item.children, detailsEle);});
}

CSS

null

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

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

相关文章

JS 文件导出,jszip多文件压缩导出

文章目录 JS 文件导出&#xff0c;jszip压缩导出1、单个文件导出2、压缩导出3、axios请求通过地址获取Blob源数据 JS 文件导出&#xff0c;jszip压缩导出 1、单个文件导出 let urlhttp://~.png // 可直接访问地址 // 当源数据为blob时 // url window.URL.createObjectURL(bl…

已经在datagrip或navicate等数据库管理工具连接上了mysql8.0,但是现在忘记了,怎么快速重置密码

直接在datagrip的查询终端中&#xff0c;执行这条sql&#xff0c;其中123456为你的新密码。 ALTER USER rootlocalhost IDENTIFIED BY 123456;

新手可理解的PyTorch线性层解析:神经网络的构建基石

目录 torch.nn子模块Linear Layers详解 nn.Identity Identity 类描述 Identity 类的功能和作用 Identity 类的参数 形状 示例代码 nn.Linear Linear 类描述 Linear 类的功能和作用 Linear 类的参数 形状 变量 示例代码 nn.Bilinear Bilinear 类的功能和作用 B…

国家信息安全水平等级考试NISP二级题目卷⑥(包含答案)

国家信息安全水平等级考试NISP二级题目卷&#xff08;六&#xff09; 国家信息安全水平等级考试NISP二级题目卷&#xff08;六&#xff09;需要报考咨询可以私信博主&#xff01; 前言&#xff1a; 国家信息安全水平考试(NISP)二级&#xff0c;被称为校园版”CISP”,由中国信息…

用友U8 Cloud smartweb2.RPC.d XML外部实体注入漏洞

产品介绍 用友U8cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型、集团型企业&#xff0c;提供企业级云ERP整体解决方案。它包含ERP的各项应用&#xff0c;包括iUAP、财务会计、iUFO cloud、供应链与质量管理、人力资源、生产制造、管理会计、资产管理&#…

基于gamma矫正的照片亮度调整(python和opencv实现)

import cv2 import numpy as npdef adjust_gamma(image, gamma1.0):invGamma 1.0 / gammatable np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")return cv2.LUT(image, table)# 读取图像 original cv2.imread("tes…

影视仓最新配置接口2024tvbox源配置地址

影视仓是在TVBox开源代码基础上开发的优质版本&#xff0c;安装后需要配置接口才能正常使用。影视仓"内置版"是开发者做的资源内置化修改版本&#xff0c;不用自行设置接口&#xff0c;安装后即可使用。 影视仓的接口配置方法与TVBOX一样&#xff0c;区别在于影视仓…

Winform工具箱控件MenuStrip

MenuStrip是菜单栏 ComboBox是下拉框 TextBox是文本框 DataGridView是数据表 TextBox是文本框&#xff0c;大小可以调节&#xff0c;可以是单行&#xff0c;也可以是多行&#xff0c;通过右上角的小三角可以修改。 这个文本在编辑的时候可以在属性的Text中点击右边的小三角来换…

卷积神经网络|导入图片

在学习卷积神经网络时&#xff0c;我们通常使用的就是公开的数据集&#xff0c;这里&#xff0c;我们不使用公开数据集&#xff0c;直接导入自己的图片数据&#xff0c;下面&#xff0c;就简单写个程序实现批量图片的导入。 import osfrom PIL import Imageimport numpy as np…

【docker】使用 Dockerfile 构建镜像

一、什么是Dockerfile Dockerfile 是用于构建 Docker 镜像的文本文件。它包含了一系列的指令&#xff0c;用于描述如何构建镜像的步骤和配置。 通过编写 Dockerfile&#xff0c;您可以定义镜像的基础环境、安装软件包、复制文件、设置环境变量等操作。Dockerfile 提供了一种可…

Prometheus实战篇:Prometheus监控redis

准备环境 docker-compose安装redis docker-compose.yaml version: 3 services:redis:image:redis:5container_name: rediscommand: redis-server --requirepass 123456 --maxmemory 512mbrestart: alwaysvolumes:- /data/redis/data: /dataport:- "6379:6379"dock…

Python基础(十七、函数进阶用法)

文章目录 一、函数的回顾二、函数的进阶用法1.多个返回值示例&#xff0c;获取验证码及用户名示例&#xff0c;获取用户信息 2.多种参数1.位置参数2.关键字参数3.缺省参数4.不定长参数 3.匿名函数函数作为参数传递lambda匿名函数(一行代码) 总结练习题目&#xff1a; 之前学习了…

JAVA版随机抽人

主函数 public class Main {public static void main(String[] args) {//这里存入数据String[] data {"土一","李二","张三","李四","乔冠宇","王五"};MyJFrame frame new MyJFrame(data);} }界面类 import j…

leetcode 动态规划(斐波那契数列、 爬楼梯、使用最小花费爬楼梯)

509. 斐波那契数 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n …

【React系列】Portals、Fragment

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) Portals 某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中&am…

GPU连通域分析方法

第1章连通域分析方法 连通域分析方法用于提取图像中相似属性的区域&#xff0c;并给出区域的面积&#xff0c;位置等特征信息。分为两种&#xff0c;基于游程&#xff08;Runlength&#xff09;&#xff0c;和基于标记(Label)。 基于游程的方法&#xff0c;按照行对图像进行游…

3D Gaussian Splatting复现

最近3D Gaussian Splatting很火&#xff0c;网上有很多复现过程&#xff0c;大部分都是在Windows上的。Linux上配置环境会方便简单一点&#xff0c;这里记录一下我在Linux上复现的过程。 Windows下的环境配置和编译&#xff0c;建议看这个up主的视频配置&#xff0c;讲解的很细…

[算法与数据结构][python]:Python参数传递,“值传递”还是“引用传递“?

Python中的函数参数传递方式是“传对象引用”&#xff0c;可以理解为“值传递”和“引用传递”的混合体。 在Python中&#xff0c;所有的数据类型都是对象。如果函数参数是不可变对象&#xff08;如整数、字符串、元组&#xff09;&#xff0c;那么传递的就是对象的值&#xf…

695岛屿最大面积

题目 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个…

逻辑回归简单案例分析--鸢尾花数据集

文章目录 1. IRIS数据集介绍2. 具体步骤2.1 手动将数据转化为numpy矩阵2.1.1 从csv文件数据构建Numpy数据2.1.2 模型的搭建与训练2.1.3 分类器评估2.1.4 分类器的分类报告总结2.1.5 用交叉验证&#xff08;Cross Validation&#xff09;来验证分类器性能2.1.6 完整代码&#xf…