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 开发者的习惯。掌握这些排序方法,能让我们在处理数据展示时更加得心应手。
热门推荐
跨境电商支付平台及流程,安全收款必备知识
三证合一是指的哪三证
电路板回流焊工艺中锡膏的使用需注意关键事项分析
如何管理项目监理工作流程
德阳什邡:绿色智造双轮驱动 数字化转型赋能升级
机器学习评价指标详解:MSE、RMSE、MAE与R2
养老账户余额用途解析:为老年人提供生活保障
奈达二甲双胍缓释片如何服用
中国古典园林铺地艺术:材料、图案与文化寓意的完美融合
【创意工具】如何开展有效的创造性头脑风暴过程
探秘南红玛瑙:传奇色彩背后的百科知识
善用维他命C精华 让美丽升级
清蒸鲍鱼蒸几分钟最好 鲍鱼开水蒸还是冷水蒸
吃完饭肚子鼓鼓的很胀怎么回事
如何精简简历至一页
鸿蒙开发面试总结,你掌握了几个?
李时珍泡酒药方:古方今用,健康养生
中关村科学城三期基金发布,百亿规模助力科技企业全周期成长
什么材质的水杯最好? 六种材质对比
加强小学生个人隐私安全保护:家庭、学校、社会共同努力
长途自驾,旅行规划的几个排雷小建议
探索数学之美:如何求解tan(x)的泰勒展开式
美联储利率走廊构建实践复盘:从短缺到充裕的演变
年增长500万用户,两款小众社交应用靠“饥饿营销”拿捏用户,破解用户心理成关键
宝宝拉肚子不能吃哪些
网格化管理制度在乡村治理中的实践与探索
不同行业如何正确选择不锈钢水管规格?
补交社保缴费后一般几天能查到
国有土地和集体土地的区别
初中生如何学c语言