vue3 使用antd Table组件中 rowSelection 时发现选中项 selectedRowKeys 清空没有效果,叠加了上次的选中数据

1、bug重现,选中删除一条数据,删除成功,重新请求刷新表格,且清空选中项(表格已封装过,所以不是a-table)
<table-box
   v-if="isShow"
   :columns="state.columns"
   :dataSource="state.tableData"
   :pagination="pagination"
   :rowSelection="rowSelection"
   :routerName="routerName"
   @change="handleTableChange"
   :loading="loading"
 >
</table-box>
const state = reactive({
  selectedRowKeys: []
});
const getTableData = async (formData) => {
  loading.value = true;
  let res = await request(url.GET_DEVICE_FIRM_LIST, "get", formData)
    .finally(() => {
      loading.value = false;
    })
  loading.value = false;
  state.selectedRowKeys = [];
  pagination.current = res.pages;
  pagination.total = res.total;
  state.tableData = res.rows;
};
const rowSelection = {
  onChange: (selectedRowKeys, selectedRows) => {
    state.selectedRowKeys = selectedRowKeys;
    console.log(
      `selectedRowKeys: ${selectedRowKeys}`,
      "selectedRows: ",
      selectedRows
    );
  },
};
const handleDelMore = () => {
  if (state.selectedRowKeys.length) {
    handleDel(state.selectedRowKeys);
  }
};
const handleDel = (id) => {
  let type = id instanceof Array;
  let length = 0;
  let ids = "";
  let delUrl = url.DELETE_DEVICE_FIRM + id;
  if (type) {
    length = id.length;
    ids = id.join(",");
    delUrl = url.DELETE_DEVICE_FIRM + ids;
  }
  Modal.confirm({
    title: type
      ? `您确定要删除${length}个设备厂商吗?`
      : "您确定要删除该设备厂商吗?",
    content: "删除后不可恢复哦",
    class: "del-modal",
    icon: createVNode(ExclamationCircleOutlined),
    okText: "确定",
    okType: "primary",
    cancelText: "取消",
    onOk: () => {
      request(delUrl, "delete")
        .then(() => {
          message.success("删除成功!");
          getTableData(formData);
        })
    },
    onCancel() {
      
    },
  });
};
2、删除成功且表格重新刷新成功,但是重新选中项的时候却含有上次删除的项在里边,以下图片时操作删除后然后刷新表格,再次选中打印出的数据,返回的数据id为10的数据都不存在,却还保留在了选中项中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、修改另一种写法,随意在哪儿清空都行,删除成功或者刷新表格后,再次选中后,拿到的项都是正确的
<table-box
  v-if="isShow"
  :columns="state.columns"
  :dataSource="state.tableData"
  :pagination="pagination"
  :rowSelection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
  :routerName="routerName"
  @change="handleTableChange"
  :loading="loading"
>
</table-box>
const onSelectChange = (sel) => {
  state.selectedRowKeys = sel;
};
const getTableData = async (formData) => {
  loading.value = true;
  let res = await request(url.GET_DEVICE_FIRM_LIST, "get", formData)
    .finally(() => {
      loading.value = false;
    })
  loading.value = false;
  state.selectedRowKeys = [];
  pagination.current = res.pages;
  pagination.total = res.total;
  state.tableData = res.rows;
};
const handleDelMore = () => {
  if (state.selectedRowKeys.length) {
    handleDel(state.selectedRowKeys);
  }
};
const handleDel = (id) => {
  let type = id instanceof Array;
  let length = 0;
  let ids = "";
  let delUrl = url.DELETE_DEVICE_FIRM + id;
  if (type) {
    length = id.length;
    ids = id.join(",");
    delUrl = url.DELETE_DEVICE_FIRM + ids;
  }
  Modal.confirm({
    title: type
      ? `您确定要删除${length}个设备厂商吗?`
      : "您确定要删除该设备厂商吗?",
    content: "删除后不可恢复哦",
    class: "del-modal",
    icon: createVNode(ExclamationCircleOutlined),
    okText: "确定",
    okType: "primary",
    cancelText: "取消",
    onOk: () => {
      request(delUrl, "delete")
        .then(() => {
          message.success("删除成功!");
          getTableData(formData);
        })
    },
    onCancel() {
      
    },
  });
};

你不肯清醒,看再多少文案都没用.

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现跨页多选需要记录选中数据的ID,可以使用Vue的Reactive响应式对象来进行数据绑定和监听。具体实现步骤如下: 1. 定义一个空数组selected,用来存储选中数据的ID。 ```javascript import { reactive } from 'vue'; const state = reactive({ selected: [] }); ``` 2. 在表格的每一行添加一个多选框,绑定一个change事件,根据选中状态添加或删除选中数据的ID。 ```html <template> <a-table :dataSource="data" :columns="columns"> <template #selection="{row}"> <a-checkbox v-model:checked="isSelected(row.id)" @change="handleSelect(row.id, $event.target.checked)"></a-checkbox> </template> </a-table> </template> ``` ```javascript const handleSelect = (id, checked) => { if (checked) { state.selected.push(id); } else { state.selected.splice(state.selected.indexOf(id), 1); } }; ``` 3. 在表格的分页组件添加一个自定义的选中数量显示组件,根据selected数组的长度来显示选中的数量。 ```html <template> <div> <a-pagination :total="total" :current="current" @change="handleChange"></a-pagination> <span>已选中 {{ selected.length }} </span> </div> </template> ``` 4. 在分页组件的change事件,重新加载当前页的数据,需要将之前选中数据的ID与当前页的数据进行比对,保留选中状态。 ```javascript const handleChange = (page, pageSize) => { // 获取当前页的数据 const newData = fetchData(page, pageSize); // 比对选中状态 const selectedIds = new Set(state.selected); newData.forEach(item => { if (selectedIds.has(item.id)) { item.selected = true; } }); // 更新表格数据 state.data = newData; }; ``` 这样就可以实现跨页多选了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值