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:
parent
fc002d3db3
commit
b92c6c40fa
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue