当前位置:首页 > VUE

vue点击实现升降排序

2026-01-22 23:47:16VUE

实现点击升降序排序

在Vue中实现点击表格头切换升降序排序,可以通过以下方法完成:

数据准备

data() {
  return {
    items: [
      { id: 1, name: 'Apple', price: 5 },
      { id: 2, name: 'Banana', price: 3 },
      { id: 3, name: 'Orange', price: 4 }
    ],
    sortKey: '',
    sortOrder: 1 // 1升序,-1降序
  }
}

排序方法实现

methods: {
  sortBy(key) {
    if (this.sortKey === key) {
      this.sortOrder *= -1
    } else {
      this.sortKey = key
      this.sortOrder = 1
    }

    this.items.sort((a, b) => {
      if (a[key] < b[key]) return -1 * this.sortOrder
      if (a[key] > b[key]) return 1 * this.sortOrder
      return 0
    })
  }
}

模板中使用

vue点击实现升降排序

<table>
  <thead>
    <tr>
      <th @click="sortBy('name')">名称</th>
      <th @click="sortBy('price')">价格</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="item in items" :key="item.id">
      <td>{{ item.name }}</td>
      <td>{{ item.price }}</td>
    </tr>
  </tbody>
</table>

添加排序状态指示

可以添加箭头图标显示当前排序状态

<th @click="sortBy('name')">
  名称
  <span v-if="sortKey === 'name'">
    {{ sortOrder === 1 ? '↑' : '↓' }}
  </span>
</th>

使用计算属性优化

将排序逻辑移至计算属性,避免直接修改原始数据

vue点击实现升降排序

computed: {
  sortedItems() {
    return [...this.items].sort((a, b) => {
      if (a[this.sortKey] < b[this.sortKey]) return -1 * this.sortOrder
      if (a[this.sortKey] > b[this.sortKey]) return 1 * this.sortOrder
      return 0
    })
  }
}

模板中改为使用sortedItems替代items

封装为可复用组件

可以创建一个可复用的排序表格组件

Vue.component('sortable-table', {
  props: ['data', 'columns'],
  data() {
    return {
      sortKey: '',
      sortOrder: 1
    }
  },
  methods: {
    sortBy(key) {
      if (this.sortKey === key) {
        this.sortOrder *= -1
      } else {
        this.sortKey = key
        this.sortOrder = 1
      }
    }
  },
  computed: {
    sortedData() {
      return [...this.data].sort((a, b) => {
        if (a[this.sortKey] < b[this.sortKey]) return -1 * this.sortOrder
        if (a[this.sortKey] > b[this.sortKey]) return 1 * this.sortOrder
        return 0
      })
    }
  }
})

处理数字和字符串排序

对于数字类型字段,需要特殊处理以确保正确排序

sortBy(key) {
  // 判断字段是否为数字类型
  const isNumeric = this.items.every(item => typeof item[key] === 'number')

  if (this.sortKey === key) {
    this.sortOrder *= -1
  } else {
    this.sortKey = key
    this.sortOrder = 1
  }

  this.items.sort((a, b) => {
    if (isNumeric) {
      return (a[key] - b[key]) * this.sortOrder
    }
    return String(a[key]).localeCompare(String(b[key])) * this.sortOrder
  })
}

标签: vue
分享给朋友:

相关文章

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="we…

vue实现单点

vue实现单点

Vue 实现单点登录(SSO)方案 单点登录(SSO)允许用户在多个相关但独立的系统中使用同一组凭证登录。以下是基于 Vue 的实现方案: 基于 OAuth2/OpenID Connect 的实现…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue实现反转

vue实现反转

实现数组反转 在Vue中反转数组可以通过多种方式实现,以下是几种常见方法: 使用JavaScript原生reverse方法 // 在methods中定义方法 methods: { revers…

vue博客实现

vue博客实现

Vue 博客实现步骤 项目初始化与基础配置 使用 Vue CLI 或 Vite 创建项目,安装基础依赖如 vue-router 和状态管理库(如 pinia)。配置路由文件实现页面跳转逻辑,例如博客首…