You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify v-data-table:仅点击箭头图标触发排序,屏蔽输入框排序触发

解决Vuetify v-data-table表头输入框触发排序的问题

问题原因

默认情况下,v-data-table的表头单元格(<th>)绑定了排序触发的点击事件,当点击单元格内的v-text-field时,点击事件会向上冒泡到<th>元素,从而意外触发排序逻辑。

最简单的解决方案

在v-text-field上添加@click.stop修饰符,阻止点击事件冒泡到父元素,这样点击输入框时就不会触发表头的排序操作:

<template v-for="header in headers" v-slot:[`header.${header.value}`]>
  <v-text-field 
    hide-details 
    dense 
    :key="header.value" 
    v-model="$data[header.value]" 
    id="custom-input"
    class="data-table-header-text pt-4" 
    :label="header.text" 
    placeholder="Recherche"
    @click.stop  <!-- 阻止事件冒泡 -->
  />
</template>

进阶方案(保留表头空白区排序能力)

如果希望除了输入框之外,表头的空白区域仍能触发排序,可以手动拆分输入框和排序图标,仅让图标绑定排序事件:

模板部分

<template v-for="header in headers" v-slot:[`header.${header.value}`]>
  <div class="d-flex align-center w-100">
    <v-text-field 
      hide-details 
      dense 
      :key="header.value" 
      v-model="$data[header.value]" 
      id="custom-input"
      class="data-table-header-text pt-4 flex-grow-1" 
      :label="header.text" 
      placeholder="Recherche"
    />
    <!-- 手动渲染排序图标并绑定排序逻辑 -->
    <v-icon 
      v-if="header.sortable"
      @click="toggleSort(header.value)"
      class="ml-2 cursor-pointer"
    >
      {{ header.sort === 'asc' ? 'mdi-arrow-up' : header.sort === 'desc' ? 'mdi-arrow-down' : 'mdi-unfold-more' }}
    </v-icon>
  </div>
</template>

脚本部分

methods: {
  toggleSort(field) {
    this.headers = this.headers.map(header => {
      if (header.value !== field) return { ...header, sort: '' }
      return {
        ...header,
        sort: header.sort === 'asc' ? 'desc' : header.sort === 'desc' ? '' : 'asc'
      }
    })
  }
}

内容的提问来源于stack exchange,提问作者Raphaël Chemouni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:17:25