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 开发者的习惯。掌握这些排序方法,能让我们在处理数据展示时更加得心应手。
热门推荐
支气管镜检查术前准备指南
40℃+高温来袭!开空调前做好这些准备工作,健康享受夏日清凉
天津市中小学班级人数现状及应对措施
止损止盈比例如何设置?
疫苗与免疫学
RIP路由协议的配置和应用实践
植物受伤会尖叫,还会防御和疗伤,没有神经的植物是怎么做到的?
成都一环路,世界三国文化中心
承德避暑山庄博物馆:历史与艺术的璀璨瑰宝
词的字句格式详解:从一字句到十一字句
怎么查看公司股份比例
配偶子女的继承权如何分配
美国B1B2签证申请,难点与技巧在哪里?
加密货币到底是什么
Excel表格共享设置指南:从基础到进阶的全方位教程
如何比较两个Word文档中的重复内容
B站百万粉丝UP主YJango:生命的遗产是对知识的更新
会计凭证是什么?从定义到制作全流程详解
揭秘会计凭证的构成要素:一份完整的财务记录指南
霜冻有哪些特征 霜冻是一种什么现象
爱因斯坦:教育的首要目标永远是独立思考,而非特定的知识
改变日本历史的本能寺之变:明智光秀为何谋反织田信长?
神经痛的治疗方法全解析
纤维素饮料真的能减肥吗?科学解读其作用与局限
为什么选择独立IP?揭示独立IP在网站安全、SEO优化和流量稳定中的重要性
EPDM与TPE为什么会粘在一起?
Spring Boot中控制使用特定实现类的5种方法
光束质量分析仪:原理、应用与测量指南
最新研究:中药治疗急性脑出血的多中心随机对照试验结果公布
工程造价的概念与工程款处理详解