提交 4b384b13 作者: vben

perf: perf TableAction

上级 5a6db8c6
...@@ -8,11 +8,13 @@ ...@@ -8,11 +8,13 @@
### ⚡ Performance Improvements ### ⚡ Performance Improvements
- 优化首屏体积大小 - 优化首屏体积大小
- 优化 TableAction 组件
### 🐛 Bug Fixes ### 🐛 Bug Fixes
- 修复一级菜单折叠显示菜单名问题 - 修复一级菜单折叠显示菜单名问题
- 修复预览命令不打包问题 - 修复预览命令不打包问题
- 修复表格 actionColOptions 参数不生效问题
# 2.0.0-rc.3 (2020-10-19) # 2.0.0-rc.3 (2020-10-19)
......
import { defineComponent, ref, computed, unref } from 'vue';
import { injectTable } from '../hooks/useProvinceTable';
import { getSlot } from '/@/utils/helper/tsxHelper';
import VueDraggableResizable from 'vue-draggable-resizable';
export default defineComponent({
name: 'DragResize',
setup(props, { slots, attrs }) {
const elRef = ref<HTMLTableRowElement | null>(null);
const draggingMapRef = ref<{ [key in string]: number | string }>({});
const tableInstance = injectTable();
const getColumnsRef = computed(() => {
const columns = tableInstance.getColumns();
columns.forEach((col) => {
const { key } = col;
if (key) {
draggingMapRef.value[key] = col.width as number;
}
});
return columns;
});
return () => {
const { key = '', ...restProps } = { ...attrs };
const col = unref(getColumnsRef).find((col) => {
const k = col.dataIndex || col.key;
return k === key;
});
if (!col || !col.width) {
return <th {...restProps}>{getSlot(slots, 'default')}</th>;
}
const onDrag = (x: number) => {
draggingMapRef.value[key] = 0;
col.width = Math.max(x, 1);
};
const onDragstop = () => {
const el = unref(elRef);
if (!el) {
return;
}
draggingMapRef.value[key] = el.getBoundingClientRect().width;
};
return (
<th
{...restProps}
class="resize-table-th"
ref={elRef}
style={{
width: `${col.width}px`,
}}
>
{getSlot(slots, 'default')}
<VueDraggableResizable
key={col.key}
class="table-draggable-handle"
w={10}
x={draggingMapRef.value[key] || col.width}
z={1}
axis="x"
draggable={true}
resizable={false}
onDragging={onDrag}
onDragstop={onDragstop}
/>
</th>
);
};
},
});
...@@ -16,33 +16,17 @@ export default defineComponent({ ...@@ -16,33 +16,17 @@ export default defineComponent({
type: Array as PropType<ActionItem[]>, type: Array as PropType<ActionItem[]>,
default: null, default: null,
}, },
moreText: {
type: String as PropType<string>,
default: '更多',
},
}, },
setup(props) { setup(props) {
// 增加按钮的TYPE和COLOR function renderButton(action: ActionItem, index: number) {
return () => { const { disabled = false, label, icon, color = '', type = 'link' } = action;
const { dropDownActions = [], actions } = props;
return (
<div class={prefixCls}>
{actions &&
actions.length &&
actions.map((action, index) => {
const {
disabled = false,
label,
icon,
color = '',
type = 'link',
popConfirm = null,
} = action;
const button = ( const button = (
<Button <Button type={type} size="small" disabled={disabled} color={color} {...action} key={index}>
type={type}
size="small"
disabled={disabled}
color={color}
{...action}
key={index}
>
{() => ( {() => (
<> <>
{label} {label}
...@@ -51,7 +35,14 @@ export default defineComponent({ ...@@ -51,7 +35,14 @@ export default defineComponent({
)} )}
</Button> </Button>
); );
if (popConfirm !== null) { return button;
}
function renderPopConfirm(action: ActionItem, index: number) {
const { popConfirm = null } = action;
if (!popConfirm) {
return renderButton(action, index);
}
const { const {
title, title,
okText = '确定', okText = '确定',
...@@ -70,60 +61,48 @@ export default defineComponent({ ...@@ -70,60 +61,48 @@ export default defineComponent({
cancelText={cancelText} cancelText={cancelText}
icon={icon} icon={icon}
> >
{() => button} {() => renderButton(action, index)}
</Popconfirm> </Popconfirm>
); );
} }
return button;
})} const dropdownDefaultSLot = () => (
{dropDownActions && dropDownActions.length && (
<Dropdown>
{{
default: () => (
<Button type="link" size="small"> <Button type="link" size="small">
{{ {{
default: () => ( default: () => (
<> <>
更多 {props.moreText}
<DownOutlined /> <DownOutlined />
</> </>
), ),
}} }}
</Button> </Button>
), );
// 增加按钮的TYPE和COLOR
return () => {
const { dropDownActions = [], actions } = props;
return (
<div class={prefixCls}>
{actions?.map((action, index) => {
return renderPopConfirm(action, index);
})}
{dropDownActions?.length && (
<Dropdown>
{{
default: dropdownDefaultSLot,
overlay: () => { overlay: () => {
return ( return (
<Menu> <Menu>
{{ {{
default: () => { default: () => {
return dropDownActions.map((action, index) => { return dropDownActions.map((action, index) => {
const { const { disabled = false } = action;
disabled = false,
label,
icon,
color = '',
type = 'link',
} = action;
return ( return (
<Menu.Item key={`${index}`} disabled={disabled}> <Menu.Item key={`${index}`} disabled={disabled}>
{() => ( {() => {
<Button return renderPopConfirm(action, index);
type={type}
size="small"
{...action}
disabled={disabled}
color={color}
>
{{
default: () => (
<>
{label}
{icon && <Icon icon={icon} />}
</>
),
}} }}
</Button>
)}
</Menu.Item> </Menu.Item>
); );
}); });
......
...@@ -46,7 +46,7 @@ const EditableCell = defineComponent({ ...@@ -46,7 +46,7 @@ const EditableCell = defineComponent({
const currentValueRef = ref<string | boolean>(props.value); const currentValueRef = ref<string | boolean>(props.value);
function handleChange(e: ChangeEvent | string | boolean) { function handleChange(e: ChangeEvent | string | boolean) {
if ((e as ChangeEvent).target && Reflect.has((e as ChangeEvent).target, 'value')) { if (Reflect.has((e as ChangeEvent)?.target, 'value')) {
currentValueRef.value = (e as ChangeEvent).target.value; currentValueRef.value = (e as ChangeEvent).target.value;
} }
if (isString(e) || isBoolean(e)) { if (isString(e) || isBoolean(e)) {
...@@ -58,7 +58,7 @@ const EditableCell = defineComponent({ ...@@ -58,7 +58,7 @@ const EditableCell = defineComponent({
isEditRef.value = true; isEditRef.value = true;
nextTick(() => { nextTick(() => {
const el = unref(elRef); const el = unref(elRef);
el && el.focus && el.focus(); el?.focus();
}); });
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论