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

Vuetify data table v-model选中项在表格数据刷新时无响应如何解决

问题根因

Vuetify v-data-table 默认开启 return-object: true 配置,选中项存储的是首次选中时的对象引用。你定时刷新表格数据源时,替换了整个数组,数组内的对象都是全新的引用,和selected数组中存储的旧对象没有关联,因此属性不会自动同步更新。

解决方案

方案1:配置return-object属性(改动最小,适合大量表格批量修改)

直接给v-data-table添加return-object="false"配置即可,此时v-model绑定的selected数组存储的是你配置的item-key对应的值(示例中是每行的name字段值),而非完整对象。
需要使用完整选中对象时,通过计算属性实时从最新的数据源数组中匹配即可,天然就是最新值。

HTML修改示例:

<v-data-table
  v-model="selected"
  show-select
  item-key="name"
  return-object="false" <!-- 仅需新增这一行配置 -->
  :headers="headers"
  :items="desserts"
  :options.sync="options"
  :server-items-length="totalDesserts"
  :loading="loading"
  class="elevation-1"
>
</v-data-table>

新增计算属性获取实时的选中对象:

computed: {
  selectedItems() {
    // 永远从最新的desserts数组匹配选中项
    return this.selected.map(name => this.desserts.find(item => item.name === name)).filter(Boolean)
  }
}

后续所有使用选中对象的场景直接使用selectedItems即可,表格数据刷新后会自动同步最新属性。

方案2:封装通用Mixin自动同步(无感知适配)

如果项目中大量表格都需要保留return-object: true的配置,可以封装全局通用Mixin,自动监听数据源变化更新选中项,每个业务组件无需编写额外逻辑:

// 全局通用mixin
const dataTableSyncMixin = {
  watch: {
    desserts(newItems) {
      if (!this.selected?.length) return
      // 可根据项目统一约定的itemKey做匹配
      const itemKey = 'name'
      this.selected = this.selected.map(oldItem => {
        return newItems.find(newItem => newItem[itemKey] === oldItem[itemKey])
      }).filter(Boolean)
    }
  }
}

使用时仅需在对应组件引入该Mixin即可,无需修改业务代码。

内容的提问来源于stack exchange,提问作者hobbes_child

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 06:45:04