說明在 Vue 製作點擊列表標頭調整排序的做法。
功能 | 實作方式 |
---|---|
表格資料 | 使用 ref() 儲存原始資料 |
排序欄位 | sortKey 儲存目前排序欄位 |
升冪/降冪 | sortAsc 控制排序方向 |
排序邏輯 | 用 computed() 建立排序後的陣列 |
HTML 部分
<template>
<table class="table table-bordered">
<thead>
<tr>
<th @click="sortBy('name')">
姓名
<span v-if="sortKey === 'name'">
<i :class="sortAsc ? 'fa fa-arrow-up' : 'fa fa-arrow-down'"></i>
</span>
</th>
<th @click="sortBy('email')">
Email
<span v-if="sortKey === 'email'">
<i :class="sortAsc ? 'fa fa-arrow-up' : 'fa fa-arrow-down'"></i>
</span>
</th>
<th @click="sortBy('height')">
身高
<span v-if="sortKey === 'height'">
<i :class="sortAsc ? 'fa fa-arrow-up' : 'fa fa-arrow-down'"></i>
</span>
</th>
<th @click="sortBy('weight')">
體重
<span v-if="sortKey === 'weight'">
<i :class="sortAsc ? 'fa fa-arrow-up' : 'fa fa-arrow-down'"></i>
</span>
</th>
</tr>
</thead>
<tbody>
<tr v-for="(person, index) in sortedPeople" :key="index">
<td>{{ person.name }}</td>
<td>{{ person.email }}</td>
<td>{{ person.height }}</td>
<td>{{ person.weight }}</td>
</tr>
</tbody>
</table>
</template>
<script setup>
排序邏輯
import { ref, computed } from 'vue' // 假資料:姓名、email、身高(cm)、體重(kg) const people = ref([ { name: '王小明', email: '[email protected]', height: 172, weight: 68 }, { name: '陳美麗', email: '[email protected]', height: 160, weight: 54 }, { name: '李志強', email: '[email protected]', height: 180, weight: 75 }, { name: '張惠君', email: '[email protected]', height: 165, weight: 60 } ]) const sortKey = ref('') const sortAsc = ref(true) // 切換排序欄位 const sortBy = (key) => { if (sortKey.value === key) { sortAsc.value = !sortAsc.value } else { sortKey.value = key sortAsc.value = true } } // 排序後的資料 const sortedPeople = computed(() => { const list = [...people.value] if (!sortKey.value) return list return list.sort((a, b) => { const valA = a[sortKey.value] const valB = b[sortKey.value] if (valA < valB) return sortAsc.value ? -1 : 1 if (valA > valB) return sortAsc.value ? 1 : -1 return 0 }) })
這樣就可以點擊列表的標頭去做資料內容排序,如果不是用表格,只要在對應的地方觸發 method 就好了。