【Vue3】Vue 3 中列表排序的优化技巧

在这里插入图片描述

本文将深入探讨 Vue 3 中列表排序的优化技巧,帮助提升应用的性能和响应速度。

1. 避免不必要的排序

按需排序

在实际应用中,并非每次数据更新都需要进行排序。例如,当列表数据仅在特定条件下需要排序时,可通过条件判断来避免不必要的排序操作。

<template><div><button @click="shouldSort = true">排序</button><ul><li v-for="item in sortedList" :key="item.id">{{ item.name }}</li></ul></div>
</template><script setup>
import { ref, computed } from 'vue';const list = ref([{ id: 1, name: 'Apple' },{ id: 2, name: 'Banana' },{ id: 3, name: 'Cherry' }
]);const shouldSort = ref(false);const sortedList = computed(() => {if (shouldSort.value) {return [...list.value].sort((a, b) => a.name.localeCompare(b.name));}return list.value;
});
</script>

防抖与节流

当排序操作与用户交互(如点击排序按钮)相关时,可使用防抖(Debounce)或节流(Throttle)技术来减少不必要的排序触发。以防抖为例,在用户频繁点击排序按钮时,只在最后一次点击后的一段时间后执行排序操作。

<template><div><button @click="debouncedSort">排序</button><ul><li v-for="item in sortedList" :key="item.id">{{ item.name }}</li></ul></div>
</template><script setup>
import { ref, computed } from 'vue';
import { debounce } from 'lodash';const list = ref([{ id: 1, name: 'Apple' },{ id: 2, name: 'Banana' },{ id: 3, name: 'Cherry' }
]);const sortedList = computed(() => {return [...list.value].sort((a, b) => a.name.localeCompare(b.name));
});const debouncedSort = debounce(() => {// 这里可以添加其他与排序相关的逻辑
}, 300);
</script>

2. 优化排序算法

选择合适的排序算法

JavaScript 数组的 sort() 方法默认使用的是不稳定的排序算法,在某些情况下可能无法满足需求。对于大型数据集,可考虑使用更高效的排序算法,如快速排序(Quick Sort)或归并排序(Merge Sort)。不过,由于 JavaScript 引擎对 sort() 方法进行了优化,在大多数情况下,直接使用 sort() 已经足够高效。

减少比较次数

在多字段排序时,可通过合理安排比较字段的顺序,减少不必要的比较次数。例如,优先比较区分度大的字段。

const sortedList = [...list].sort((a, b) => {if (a.category!== b.category) {return a.category.localeCompare(b.category);}return a.name.localeCompare(b.name);
});

3. 利用计算属性和缓存

计算属性的使用

在 Vue 3 中,计算属性(Computed Properties)会自动缓存结果,只有当依赖的数据发生变化时才会重新计算。因此,将排序逻辑封装在计算属性中可以避免不必要的重复计算。

<template><div><ul><li v-for="item in sortedList" :key="item.id">{{ item.name }}</li></ul></div>
</template><script setup>
import { ref, computed } from 'vue';const list = ref([{ id: 1, name: 'Apple' },{ id: 2, name: 'Banana' },{ id: 3, name: 'Cherry' }
]);const sortedList = computed(() => {return [...list.value].sort((a, b) => a.name.localeCompare(b.name));
});
</script>

手动缓存排序结果

在某些场景下,可手动缓存排序结果,避免重复排序。例如,当数据更新但排序条件未改变时,直接使用缓存的排序结果。

<template><div><button @click="updateData">更新数据</button><ul><li v-for="item in sortedList" :key="item.id">{{ item.name }}</li></ul></div>
</template><script setup>
import { ref, computed } from 'vue';const list = ref([{ id: 1, name: 'Apple' },{ id: 2, name: 'Banana' },{ id: 3, name: 'Cherry' }
]);let cachedSortedList = null;
let lastSortCondition = null;const sortedList = computed(() => {const currentSortCondition = 'name'; // 这里可以根据实际情况动态变化if (currentSortCondition === lastSortCondition && cachedSortedList) {return cachedSortedList;}cachedSortedList = [...list.value].sort((a, b) => a.name.localeCompare(b.name));lastSortCondition = currentSortCondition;return cachedSortedList;
});const updateData = () => {list.value = [{ id: 4, name: 'Date' },{ id: 5, name: 'Eggplant' }];
};
</script>

4. 虚拟列表与分页

虚拟列表

当列表数据量非常大时,一次性渲染所有数据会导致性能问题。虚拟列表(Virtual List)技术只渲染当前可见区域的数据,从而显著提升性能。在 Vue 3 中,可使用第三方库如 vue-virtual-scroller 来实现虚拟列表。

<template><div><VirtualList :items="list" :item-size="30"><template #item="{ item }"><div>{{ item.name }}</div></template></VirtualList></div>
</template><script setup>
import { ref } from 'vue';
import { VirtualList } from 'vue-virtual-scroller';
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';const list = ref([// 大量数据...
]);
</script>

分页

分页是另一种减少一次性渲染数据量的有效方法。通过将数据分成多个页面,每次只加载和渲染当前页面的数据。

<template><div><ul><li v-for="item in currentPageData" :key="item.id">{{ item.name }}</li></ul><button @click="prevPage" :disabled="currentPage === 1">上一页</button><button @click="nextPage" :disabled="currentPage === totalPages">下一页</button></div>
</template><script setup>
import { ref, computed } from 'vue';const list = ref([// 大量数据...
]);const itemsPerPage = 10;
const currentPage = ref(1);const totalPages = computed(() => {return Math.ceil(list.value.length / itemsPerPage);
});const currentPageData = computed(() => {const startIndex = (currentPage.value - 1) * itemsPerPage;const endIndex = startIndex + itemsPerPage;return list.value.slice(startIndex, endIndex);
});const prevPage = () => {if (currentPage.value > 1) {currentPage.value--;}
};const nextPage = () => {if (currentPage.value < totalPages.value) {currentPage.value++;}
};
</script>

总结

在 Vue 3 中进行列表排序时,通过避免不必要的排序、优化排序算法、利用计算属性和缓存以及采用虚拟列表与分页技术等优化技巧,可以显著提升应用的性能和用户体验。开发者应根据具体的业务场景和数据量大小,选择合适的优化策略。

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

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

相关文章

HaProxy源码安装(Rocky8)

haproxy具有高性能、高可用性、灵活的负载均衡策略和强大的将恐和日志功能&#xff0c;是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件&#xff0c;是一款具 备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&a…

调用openssl实现加解密算法

由于工作中涉及到加解密&#xff0c;包括Hash&#xff08;SHA256&#xff09;算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法&#xff0c;笔者通过查询发现openssl库以上算法都支持&#xff0c;索性借助openssl库实现上述5类算法。笔者用的op…

1-13 tortoiseGit忽略文件与文件夹

前言&#xff1a; 基于本人对小乌龟操作的学习和思考&#xff0c;仅供参考 1-1 忽略问价和文件夹 有时候我们的一些文件是不想要提交&#xff0c;那么我们可以使用stash的方式给这个文件添加忽略&#xff0c;那么我们现在来给这个实际操作创建一个操作的环境。 右键选中添加到忽…

✨2.快速了解HTML5的标签类型

✨✨HTML5 的标签类型丰富多样&#xff0c;每种类型都有其独特的功能和用途&#xff0c;以下是一些常见的 HTML5 标签类型介绍&#xff1a; &#x1f98b;结构标签 &#x1faad;<html>&#xff1a;它是 HTML 文档的根标签&#xff0c;所有其他标签都包含在这个标签内&am…

PostgreSQL 的崛起与无服务器数据库的新时代

根据 2023 年 Stack Overflow 开发人员调查 &#xff0c;PostgreSQL 超越 MySQL 成为最受开发人员推崇和期望的数据库系统&#xff0c;这是一个重要的里程碑。这一转变反映了开发人员社区对 PostgreSQL 强大的功能集、可靠性和可扩展性的日益认同。 这种不断变化的格局激发了数…

Redis(高阶篇)03章——缓存双写一致性之更新策略探讨

一、反馈回来的面试题 一图你只要用缓存&#xff0c;就可能会涉及到redis缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性的问题双写一致性&#xff0c;你先动缓存redis还是数据库mysql哪一个&#x…

【机器学习监督学习】:从原理到实践,探索算法奥秘,揭示数据标注、模型训练与预测的全过程,助力人工智能技术应用与发展

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏:机器学习专栏 目录 线性回归&#xff08;Linear Regression&#xff09; 基本概念 数学模型 优缺点 利用Python实现线性回归 逻辑回归&#xff08;Logistic Regression&#xff09; 3.2. 数学模型 优缺点 …

数据结构_前言

本次我们将进入一个新的阶段啦~ 要注意哦&#xff1a; 在学数据结构之前&#xff0c;我们要先掌握c语言中所学的指针、结构体、内存的存储这几部分&#xff0c;如果还没太掌握的话&#xff0c;那记得去复习回顾一下噢。 下面我们就一起进入数据结构的学习吧&#xff01; 知识…

VirtualBox 中使用 桥接网卡 并设置 MAC 地址

在 VirtualBox 中使用 桥接网卡 并设置 MAC 地址&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;设置桥接网卡 打开 VirtualBox&#xff0c;选择你的虚拟机&#xff0c;点击 “设置” (Settings)。进入 “网络” (Network) 选项卡。在 “适配器 1” (Adapt…

【Mysql】索引

【Mysql】索引 一、索引的简介二、索引结构2.1 Hash2.2 二叉搜索树2.3 B树2.4 B树 三、索引分类3.1 主键索引3.2 普通索引3.3 唯一索引3.4 全文索引3.5 聚集索引3.6 非聚集索引3.7 索引覆盖 四、使用索引4.1 自动创建索引4.2 手动创建索引4.2.1 主键索引4.2.2 唯一索引4.2.3 普…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…

1、Window Android 13模拟器 将编译的映像文件导入Android Studio

1、环境准备 编译环境&#xff1a;Ubuntu-18.04.5编译版本&#xff1a;android13-release下载地址&#xff1a;清华大学开源软件镜像站AOSP # 下载repo # 同步代码&#xff1a;repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-r…

UE5 Niagara 粒子远处闪烁解决

在UE5.2中使用Niagara粒子系统制作水特效时&#xff0c;远处出现粒子闪烁的问题&#xff0c;通常由渲染精度、深度冲突或LOD设置引起 .效果如下&#xff1a; 处理深度缓冲冲突&#xff08;Z-Fighting&#xff09; 问题原因&#xff1a;粒子与场景几何体深度值重叠导致闪烁。 …

机器学习入门实战 4 - 基本模型

&#x1f4cc; 机器学习基本模型项目实战&#xff1a;预测泰坦尼克号乘客的生存概率 &#x1f6a2; 项目背景 1912 年 4 月 15 日&#xff0c;泰坦尼克号在处女航中撞上冰山沉没&#xff0c;船上 2224 名乘客和船员中&#xff0c;仅有约 710 人生还。 哪些因素决定了生还几率&…

电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案

作者背景 拥有8年乙方项目经理经验、8年甲方信息化管理经验&#xff0c;主导过12个Odoo制造业项目落地&#xff0c;服务客户涵盖消费电子、汽车电子、工业设备等领域。本文基于华东某电子企业&#xff08;以下简称"A公司"&#xff09;的实战案例&#xff0c;解析行业…

Python - 爬虫利器 - BeautifulSoup4常用 API

文章目录 前言BeautifulSoup4 简介主要特点&#xff1a;安装方式: 常用 API1. 创建 BeautifulSoup 对象2. 查找标签find(): 返回匹配的第一个元素find_all(): 返回所有匹配的元素列表select_one() & select(): CSS 选择器 3. 访问标签内容text 属性: 获取标签内纯文本get_t…

排序与算法:选择排序

执行效果 选择排序的执行效果是这样的&#xff1a; 呃……看不懂吗&#xff1f;没关系&#xff0c;接着往下看介绍 算法介绍 选择排序&#xff08;Selection sort&#xff09;是一种简单直观的排序算法。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置…

Day4:强化学习之Qlearning走迷宫

一、迷宫游戏 1.环境已知 迷宫环境是定义好的&#xff0c;障碍物位置和空位置是已知的&#xff1b; # 定义迷宫 grid [[0, 0, 0, 1, 0],[0, 1, 0, 1, 0],[0, 1, 0, 0, 0],[0, 0, 0, 1, 0],[0, 1, 1, 1, 0] ] 2.奖励方式已知 如果碰到障碍物则得-1&#xff0c;如果到终点则…

Windows 环境下 Grafana 安装指南

目录 下载 Grafana 安装 Grafana 方法 1&#xff1a;使用 .msi 安装程序&#xff08;推荐&#xff09; 方法 2&#xff1a;使用 .zip 压缩包 启动 Grafana 访问 Grafana 配置 Grafana&#xff08;可选&#xff09; 卸载 Grafana&#xff08;如果需要&#xff09; 下载 G…

栈回溯方案

注&#xff1a;栈回溯无法很好的定位到未调优化的函数&#xff0c;需要编译前使用 -fno-optimize-sibling-calls 选项禁止尾调优化。 基于unwind的栈回溯 在 arm 架构下&#xff0c;不少32位系统用的是 unwind 形式的栈回溯&#xff0c;这种栈回溯要复杂很多。首先需要程序有一…