Fix the demo /comp/table/formTable about selection cross pages (#3468)

* fix: keep rowSelection onChange call outside

* fix: demo FormTable about seletion
This commit is contained in:
xachary 2023-12-27 09:15:15 +08:00 committed by GitHub
parent fc002d3db3
commit b92c6c40fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 74 additions and 37 deletions

View File

@ -1,14 +1,12 @@
<template> <template>
<BasicTable @register="registerTable"> <BasicTable @register="registerTable" @fetch-success="checkedRecordsUpdate">
<template #form-custom> custom-slot </template> <template #form-custom> custom-slot </template>
<template #headerTop> <template #headerTop>
<Alert type="info" show-icon> <Alert type="info" show-icon>
<template #message> <template #message>
<template v-if="state.selectedRowKeys.length > 0"> <template v-if="checkedRecords.length > 0">
<span>已选中{{ state.selectedRowKeys.length }}条记录(可跨页)</span> <span>已选中{{ checkedRecords.length }}条记录(可跨页)</span>
<a-button type="link" @click="state.selectedRowKeys.splice(0)" size="small" <a-button type="link" @click="tableSelectBarClear" size="small">清空</a-button>
>清空</a-button
>
</template> </template>
<template v-else> <template v-else>
<span>未选中任何项目</span> <span>未选中任何项目</span>
@ -22,21 +20,83 @@
</BasicTable> </BasicTable>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive } from 'vue'; import { ref, nextTick } from 'vue';
import { BasicTable, useTable } from '@/components/Table'; import { BasicTable, useTable } from '@/components/Table';
import { getBasicColumns, getFormConfig } from './tableData'; import { getBasicColumns, getFormConfig } from './tableData';
import { Alert } from 'ant-design-vue'; import { Alert } from 'ant-design-vue';
import type { Key } from 'ant-design-vue/lib/table/interface'; import type { Key } from 'ant-design-vue/lib/table/interface';
import type { TableRowSelection } from '@/components/Table/src/types/table';
import { demoListApi } from '@/api/demo/table'; import { demoListApi } from '@/api/demo/table';
const state = reactive<{ const checkedRecords = ref<Key[]>([]);
selectedRowKeys: Key[]; const checkedPageRecords = ref<Key[]>([]);
}>({
selectedRowKeys: [],
});
const [registerTable, { getForm }] = useTable({ const rowSelectionOnChange: TableRowSelection['onChange'] = (selectedRowKeys) => {
//
const adds = selectedRowKeys.filter((key) => !checkedPageRecords.value.includes(key));
//
const removes = checkedPageRecords.value.filter((key) => !selectedRowKeys.includes(key));
// /
for (const k of adds) {
const index = checkedRecords.value.findIndex((key) => key === k);
if (index > -1) {
checkedRecords.value.splice(index, 1, k);
} else {
checkedRecords.value.push(k);
}
}
//
for (const k of removes) {
const index = checkedRecords.value.findIndex((key) => key === k);
if (index > -1) {
checkedRecords.value.splice(index, 1);
}
}
//
checkedPageRecords.value = [...selectedRowKeys];
};
//
const tableSelectBarClear = () => {
checkedRecords.value = [];
setSelectedRowKeys([]);
};
//
// const checkedRecordsRemove = (ids: (string | number)[]) => {
// for (const id of ids) {
// const index = checkedRecords.value.findIndex((o) => o.id === id);
// if (index > -1) {
// checkedRecords.value.splice(index, 1);
// }
// }
// };
const checkedRecordsUpdate = () => {
//
const dataSourceKeys = getDataSource().map((o) => o.id) as Array<Key>;
for (const record of getDataSource()) {
const index = checkedRecords.value.findIndex((key) => key === record.id);
if (index > -1) {
//
checkedRecords.value.splice(index, 1, record.id as Key);
}
}
//
const pageRecords = checkedRecords.value.filter((key) => dataSourceKeys.includes(key));
//
checkedPageRecords.value = pageRecords;
nextTick(() => {
//
setSelectedRowKeys(pageRecords);
});
};
const [registerTable, { getForm, setSelectedRowKeys, getDataSource }] = useTable({
title: '开启搜索区域', title: '开启搜索区域',
api: demoListApi, api: demoListApi,
columns: getBasicColumns(), columns: getBasicColumns(),
@ -48,34 +108,11 @@
rowKey: 'id', rowKey: 'id',
rowSelection: { rowSelection: {
type: 'checkbox', type: 'checkbox',
selectedRowKeys: state.selectedRowKeys, onChange: rowSelectionOnChange,
onSelect: onSelect,
onSelectAll: onSelectAll,
}, },
}); });
function getFormValues() { function getFormValues() {
console.log(getForm().getFieldsValue()); console.log(getForm().getFieldsValue());
} }
function onSelect(record, selected) {
if (selected) {
state.selectedRowKeys.push(record.id);
return;
}
const delIdx = state.selectedRowKeys.indexOf(record.id);
if (delIdx !== -1) {
state.selectedRowKeys.splice(delIdx, 1);
}
}
function onSelectAll(selected, selectedRows, changeRows) {
const changeIds = changeRows.map((item) => item.id);
if (selected) {
state.selectedRowKeys.push(...changeIds);
} else {
state.selectedRowKeys.splice(0);
}
}
</script> </script>