Vue 3 中列表排序:单字段与多字段排序实现方案
创作时间:
作者:
@小白创作中心
Vue 3 中列表排序:单字段与多字段排序实现方案
引用
CSDN
1.
https://blog.csdn.net/weixin_44171297/article/details/145711423
在前端开发中,对数据列表进行排序是一个常见的需求。在 Vue 3 里,我们可以方便地实现根据单个字段或者多个字段对列表进行排序。本文将深入探讨如何在 Vue 3 中完成这些排序操作,涵盖组合式 API 和选项式 API 两种实现方式,并详细解释其中的原理。
单字段排序
原理
单字段排序的核心是使用 JavaScript 数组的 sort 方法。sort 方法接受一个比较函数作为参数,通过比较函数的返回值来确定元素的顺序。比较函数接收两个参数,通常表示为 a 和 b,如果返回值小于 0,则 a 排在 b 前面;如果返回值大于 0,则 a 排在 b 后面;如果返回值等于 0,则元素顺序不变。
组合式 API 实现
<template>
<div>
<button @click="sortByAgeAsc">按年龄升序排序</button>
<button @click="sortByAgeDesc">按年龄降序排序</button>
<ul>
<li v-for="person in sortedList" :key="person.id">
{{ person.name }} - {{ person.age }}
</li>
</ul>
</div>
</template>
<script setup>
import { ref } from 'vue';
const list = ref([
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 20 },
{ id: 3, name: 'Charlie', age: 30 }
]);
const sortedList = ref([...list.value]);
const sortByAgeAsc = () => {
sortedList.value = [...list.value].sort((a, b) => a.age - b.age);
};
const sortByAgeDesc = () => {
sortedList.value = [...list.value].sort((a, b) => b.age - a.age);
};
</script>
代码解释:
- 数据定义:使用
ref创建响应式数据list存储原始数据,sortedList存储排序后的数据。 - 排序函数:
sortByAgeAsc函数通过a.age - b.age实现年龄升序排序,sortByAgeDesc函数通过b.age - a.age实现年龄降序排序。
选项式 API 实现
<template>
<div>
<button @click="sortByAgeAsc">按年龄升序排序</button>
<button @click="sortByAgeDesc">按年龄降序排序</button>
<ul>
<li v-for="person in sortedList" :key="person.id">
{{ person.name }} - {{ person.age }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 20 },
{ id: 3, name: 'Charlie', age: 30 }
],
sortedList: []
};
},
created() {
this.sortedList = [...this.list];
},
methods: {
sortByAgeAsc() {
this.sortedList = [...this.list].sort((a, b) => a.age - b.age);
},
sortByAgeDesc() {
this.sortedList = [...this.list].sort((a, b) => b.age - a.age);
}
}
};
</script>
代码解释:
- 数据定义:在
data选项中定义list和sortedList。 - 生命周期钩子:在
created钩子中初始化sortedList。 - 方法定义:
sortByAgeAsc和sortByAgeDesc方法实现排序逻辑。
多字段排序
原理
多字段排序是在单字段排序的基础上,当第一个字段相等时,再根据第二个字段进行排序,以此类推。通过在比较函数中添加多个比较条件来实现。
组合式 API 实现
<template>
<div>
<button @click="sortList">按年龄和名字排序</button>
<ul>
<li v-for="person in sortedList" :key="person.id">
{{ person.name }} - {{ person.age }}
</li>
</ul>
</div>
</template>
<script setup>
import { ref } from 'vue';
const list = ref([
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 25 },
{ id: 3, name: 'Charlie', age: 30 },
{ id: 4, name: 'Alice', age: 20 }
]);
const sortedList = ref([...list.value]);
const sortList = () => {
sortedList.value = [...list.value].sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age;
}
return a.name.localeCompare(b.name);
});
};
</script>
代码解释:
- 数据定义:同单字段排序。
- 排序函数:先比较
age字段,如果age不同则按age升序排序;如果age相同,则使用localeCompare方法按name字段的字母顺序排序。
选项式 API 实现
<template>
<div>
<button @click="sortList">按年龄和名字排序</button>
<ul>
<li v-for="person in sortedList" :key="person.id">
{{ person.name }} - {{ person.age }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 25 },
{ id: 3, name: 'Charlie', age: 30 },
{ id: 4, name: 'Alice', age: 20 }
],
sortedList: []
};
},
created() {
this.sortedList = [...this.list];
},
methods: {
sortList() {
this.sortedList = [...this.list].sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age;
}
return a.name.localeCompare(b.name);
});
}
}
};
</script>
代码解释:
- 数据定义:在
data选项中定义list和sortedList。 - 生命周期钩子:在
created钩子中初始化sortedList。 - 方法定义:
sortList方法实现多字段排序逻辑。
总结
在 Vue 3 中进行列表排序,无论是单字段还是多字段排序,核心都是利用 JavaScript 数组的 sort 方法。通过组合式 API 或选项式 API,我们可以根据项目需求选择合适的实现方式。组合式 API 更适合处理复杂逻辑和复用代码,而选项式 API 则更符合传统 Vue 开发者的习惯。掌握这些排序方法,能让我们在处理数据展示时更加得心应手。
热门推荐
央视主持人大赛:一场新闻梦想的盛宴
精选十部国产经典武侠电影,赶紧收藏起来慢慢看
《2024中国电影观众变化趋势报告》发布:女性及95后成观影主力,喜剧片最受欢迎
热水器选购攻略:燃气热水器有哪些优缺点?如何挑选燃气热水器?
以“我的孙悟空”温暖世界的漫画家手塚治虫
痰中带血是肺结核?这份自查指南请收好
梦境背后隐藏的50个含义:你的潜意识在告诉你什么
重度抑郁延误治疗,后果有多严重?
葛均波院士:“三高”共管以降低心脏病风险
老君山深度游:打卡道教圣地,避开维修区
老君山上道教古建探秘:打卡网红圣地
企业补充医疗保险:如何优化管理?
单位少缴医保,员工如何依法维权?
文化中国行 | 汲古润今、延续文脉 古城焕发新光彩
文化中国行 | 多彩文化传播 古城墙迸发新活力
纹绣店开业如何玩转客户服务?
纹绣店如何靠社交媒体和网红爆红?
两天一夜惠州深度游:从西湖到罗浮山,领略岭南名城魅力
春节打卡莆田:南日岛&济川村,海岛与古村的完美邂逅
正月二十到莆田,看皂隶舞闹元宵
春节探访妈祖故乡:湄洲岛的历史文化之旅
磁吸锁故障自救手册:告别被困尴尬!
重庆“天坑村”下庄村:春节活动精彩纷呈,乡村振兴焕发新活力
一首让人感慨的诗,道尽人生易老的无奈与沧桑,最后两句让人唏嘘
淄博下周大雪预警!出行攻略速看
淄博旅游新宠:这五大景点你不能错过!
淄博齐文化:从古城到现代的传承之旅
打卡象山影视城,《琅琊榜》同款取景地!
探访《长安十二时辰》取景地:象山影视城
戒酒一个月,你的身体会感谢你!