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

Vue Good Table选中行操作中如何获取选中行数据

解决vue-good-table无法获取选中行数据的问题

嘿,我来帮你搞定这个选中行数据拿不到的问题!看了你的代码,发现几个小问题,咱们一步步来修正:

1. 先把模板里的语法错误修好

你写的vue-good-table标签里多了个多余的</div>,这会让组件渲染出问题,先把模板改对:

<vue-good-table 
  @on-selected-rows-change="handleSelectedRowsChange(shift, $event)" 
  :columns="columns2" 
  :ref="`shift-table-${shift.id}`" 
  :rows="orderedPlacedUsers(shift)" 
  :select-options="{ enabled: true, selectOnCheckboxOnly: true }"
>
  <template slot="selected-row-actions">
    <button class="btn btn__small btn__flat" @click="lockAll(shift)">
      Lock All <i class="ml-2 fas fa-lock-alt"></i>
    </button>
  </template>
</vue-good-table>

这里我把ref改成了shift-table-${shift.id},这样每个shift对应的表格ref都是唯一的,不会和其他表格冲突;同时用<template>包裹slot内容,这是Vue slot的标准写法哦。

2. 用事件存选中行(最靠谱的方式)

直接靠$refs拿选中行有时候会踩坑,比如组件还没渲染好、ref引用冲突之类的。官方其实推荐用on-selected-rows-change事件来同步选中行数据,咱们这么做:

首先在data里加个对象,专门存每个shift对应的选中行:

data() {
  return {
    columns2: [
      { label: '', field: 'extras', tdClass: 'text-center', sortable: false, },
      { label: 'Name', field: 'fullName', },
      { label: 'Signed Up', field: 'created', sortable: false, },
      { label: 'Job', field: 'requestedJob.title', tdClass: 'text-center', },
      { label: '', field: 'notes', sortable: false, tdClass: 'text-center', },
      { label: '', field: 'reservations', tdClass: 'text-center', sortable: false, },
      { label: '', field: 'delete', tdClass: 'text-center', sortable: false, },
    ],
    selectedRowsByShift: {} // 新增:key是shift的id,value是对应的选中行数组
  }
}

然后加个方法处理选中行变化的事件:

methods: {
  handleSelectedRowsChange(shift, selectedRows) {
    // 把当前shift的选中行存到data里,用$set确保响应式
    this.$set(this.selectedRowsByShift, shift.id, selectedRows);
  },
  lockAll(shift) {
    // 取出当前shift的选中行,没有的话默认空数组
    const selectedRows = this.selectedRowsByShift[shift.id] || [];
    if (selectedRows.length === 0) {
      console.log('还没选中任何行哦!');
      return;
    }
    console.log('Shift ID:', shift.id);
    console.log('选中的行数据:', selectedRows);
    // 这里就可以写你的锁定逻辑啦
  },
  // 你的orderedPlacedUsers方法保持不变
  orderedPlacedUsers (shift) {
    function compare(a, b) {
      if (a.firstName < b.firstName) return -1;
      if (a.firstName > b.firstName) return 1;
      return 0;
    }
    return this.filteredPlacedUsers.sort(compare).filter(user => {
      return user.shift == shift.id && user.day == shift.day
    });
  },
}

3. 如果非要用ref的话(备选方案)

要是你还是想用ref来获取,那得确保ref的名字绝对唯一,而且在组件渲染完成后再访问。修改lockAll方法:

lockAll(shift) {
  const tableRef = this.$refs[`shift-table-${shift.id}`];
  if (tableRef) {
    console.log('通过ref拿到的选中行:', tableRef.selectedRows);
  } else {
    console.log('找不到对应的表格ref哦!');
  }
}

几个关键提醒

  • 因为你是循环渲染多个表格(对应不同的shift),所以每个表格的ref必须唯一,不然会互相覆盖
  • 用on-selected-rows-change同步数据是官方推荐的,比直接操作ref稳定多了
  • 检查下orderedPlacedUsers返回的数组是不是正确的,确保表格能拿到正确的行数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:07:47