Sfoglia il codice sorgente

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

* fix: keep rowSelection onChange call outside

* fix: demo FormTable about seletion
xachary 1 anno fa
parent
commit
b92c6c40fa
1 ha cambiato i file con 74 aggiunte e 37 eliminazioni
  1. 74 37
      src/views/demo/table/FormTable.vue

+ 74 - 37
src/views/demo/table/FormTable.vue

@@ -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>