|
@@ -1,14 +1,12 @@
|
|
|
<template>
|
|
|
- <BasicTable @register="registerTable">
|
|
|
+ <BasicTable @register="registerTable" @fetch-success="checkedRecordsUpdate">
|
|
|
<template #form-custom> custom-slot </template>
|
|
|
<template #headerTop>
|
|
|
<Alert type="info" show-icon>
|
|
|
<template #message>
|
|
|
- <template v-if="state.selectedRowKeys.length > 0">
|
|
|
- <span>已选中{{ state.selectedRowKeys.length }}条记录(可跨页)</span>
|
|
|
- <a-button type="link" @click="state.selectedRowKeys.splice(0)" size="small"
|
|
|
- >清空</a-button
|
|
|
- >
|
|
|
+ <template v-if="checkedRecords.length > 0">
|
|
|
+ <span>已选中{{ checkedRecords.length }}条记录(可跨页)</span>
|
|
|
+ <a-button type="link" @click="tableSelectBarClear" size="small">清空</a-button>
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
<span>未选中任何项目</span>
|
|
@@ -22,21 +20,83 @@
|
|
|
</BasicTable>
|
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
|
- import { reactive } from 'vue';
|
|
|
+ import { ref, nextTick } from 'vue';
|
|
|
import { BasicTable, useTable } from '@/components/Table';
|
|
|
import { getBasicColumns, getFormConfig } from './tableData';
|
|
|
import { Alert } from 'ant-design-vue';
|
|
|
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';
|
|
|
|
|
|
- const state = reactive<{
|
|
|
- selectedRowKeys: Key[];
|
|
|
- }>({
|
|
|
- selectedRowKeys: [],
|
|
|
- });
|
|
|
+ const checkedRecords = ref<Key[]>([]);
|
|
|
+ const checkedPageRecords = ref<Key[]>([]);
|
|
|
+
|
|
|
+ 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 [registerTable, { getForm }] = useTable({
|
|
|
+ // 移除记录(如果存在删除记录的操作)
|
|
|
+ // 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: '开启搜索区域',
|
|
|
api: demoListApi,
|
|
|
columns: getBasicColumns(),
|
|
@@ -48,34 +108,11 @@
|
|
|
rowKey: 'id',
|
|
|
rowSelection: {
|
|
|
type: 'checkbox',
|
|
|
- selectedRowKeys: state.selectedRowKeys,
|
|
|
- onSelect: onSelect,
|
|
|
- onSelectAll: onSelectAll,
|
|
|
+ onChange: rowSelectionOnChange,
|
|
|
},
|
|
|
});
|
|
|
|
|
|
function getFormValues() {
|
|
|
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>
|