Commit 808012b544b8c6f3cf467f42653c2783dbe8be6b

Authored by 无木
1 parent 40e3cb04

feat(table-action): add stopButtonPropagation prop

为TableAction组件添加stopButtonPropagation来配置是否要阻止操作列的按钮的点击事件冒泡。

close #699
src/components/Table/src/components/TableAction.vue
1 <template> 1 <template>
2 - <div :class="[prefixCls, getAlign]"> 2 + <div :class="[prefixCls, getAlign]" @click="onCellClick">
3 <template v-for="(action, index) in getActions" :key="`${index}-${action.label}`"> 3 <template v-for="(action, index) in getActions" :key="`${index}-${action.label}`">
4 <PopConfirmButton v-bind="action"> 4 <PopConfirmButton v-bind="action">
5 <Icon :icon="action.icon" class="mr-1" v-if="action.icon" /> 5 <Icon :icon="action.icon" class="mr-1" v-if="action.icon" />
@@ -56,6 +56,7 @@ @@ -56,6 +56,7 @@
56 }, 56 },
57 divider: propTypes.bool.def(true), 57 divider: propTypes.bool.def(true),
58 outside: propTypes.bool, 58 outside: propTypes.bool,
  59 + stopButtonPropagation: propTypes.bool.def(false),
59 }, 60 },
60 setup(props) { 61 setup(props) {
61 const { prefixCls } = useDesign('basic-table-action'); 62 const { prefixCls } = useDesign('basic-table-action');
@@ -122,7 +123,15 @@ @@ -122,7 +123,15 @@
122 return actionColumn?.align ?? 'left'; 123 return actionColumn?.align ?? 'left';
123 }); 124 });
124 125
125 - return { prefixCls, getActions, getDropdownList, getAlign }; 126 + function onCellClick(e: MouseEvent) {
  127 + if (!props.stopButtonPropagation) return;
  128 + const target = e.target as HTMLElement;
  129 + if (target.tagName === 'BUTTON') {
  130 + e.stopPropagation();
  131 + }
  132 + }
  133 +
  134 + return { prefixCls, getActions, getDropdownList, getAlign, onCellClick };
126 }, 135 },
127 }); 136 });
128 </script> 137 </script>
src/views/demo/table/ExpandTable.vue
1 <template> 1 <template>
2 - <div class="p-4"> 2 + <PageWrapper
  3 + title="可展开表格"
  4 + content="不可与scroll共用。TableAction组件可配置stopButtonPropagation来阻止操作按钮的点击事件冒泡,以便配合Table组件的expandRowByClick"
  5 + >
3 <BasicTable @register="registerTable"> 6 <BasicTable @register="registerTable">
4 <template #expandedRowRender="{ record }"> 7 <template #expandedRowRender="{ record }">
5 <span>No: {{ record.no }} </span> 8 <span>No: {{ record.no }} </span>
6 </template> 9 </template>
  10 + <template #action="{ record }">
  11 + <TableAction
  12 + stopButtonPropagation
  13 + :actions="[
  14 + {
  15 + label: '删除',
  16 + icon: 'ic:outline-delete-outline',
  17 + onClick: handleDelete.bind(null, record),
  18 + },
  19 + ]"
  20 + :dropDownActions="[
  21 + {
  22 + label: '启用',
  23 + popConfirm: {
  24 + title: '是否启用?',
  25 + confirm: handleOpen.bind(null, record),
  26 + },
  27 + },
  28 + ]"
  29 + />
  30 + </template>
7 </BasicTable> 31 </BasicTable>
8 - </div> 32 + </PageWrapper>
9 </template> 33 </template>
10 <script lang="ts"> 34 <script lang="ts">
11 import { defineComponent } from 'vue'; 35 import { defineComponent } from 'vue';
12 - import { BasicTable, useTable } from '/@/components/Table'; 36 + import { BasicTable, useTable, TableAction } from '/@/components/Table';
  37 + import { PageWrapper } from '/@/components/Page';
13 import { getBasicColumns } from './tableData'; 38 import { getBasicColumns } from './tableData';
14 39
15 import { demoListApi } from '/@/api/demo/table'; 40 import { demoListApi } from '/@/api/demo/table';
16 41
17 export default defineComponent({ 42 export default defineComponent({
18 - components: { BasicTable }, 43 + components: { BasicTable, TableAction, PageWrapper },
19 setup() { 44 setup() {
20 const [registerTable] = useTable({ 45 const [registerTable] = useTable({
21 - title: '可展开表格',  
22 api: demoListApi, 46 api: demoListApi,
23 - titleHelpMessage: '不能与scroll共用', 47 + title: '可展开表格演示',
  48 + titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
24 columns: getBasicColumns(), 49 columns: getBasicColumns(),
25 rowKey: 'id', 50 rowKey: 'id',
26 canResize: false, 51 canResize: false,
  52 + expandRowByClick: true,
  53 + actionColumn: {
  54 + width: 160,
  55 + title: 'Action',
  56 + slots: { customRender: 'action' },
  57 + },
27 }); 58 });
  59 + function handleDelete(record: Recordable) {
  60 + console.log('点击了删除', record);
  61 + }
  62 + function handleOpen(record: Recordable) {
  63 + console.log('点击了启用', record);
  64 + }
28 65
29 return { 66 return {
30 registerTable, 67 registerTable,
  68 + handleDelete,
  69 + handleOpen,
31 }; 70 };
32 }, 71 },
33 }); 72 });