zhitong.yu
8 天以前 378d781e6f35f89652aa36e079a8b7fc44cea77e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<template>
  <RenderTableColumn v-bind="column" />
</template>
 
<script setup lang="tsx" name="TableColumn">
import { inject, ref, useSlots } from "vue";
import { ColumnProps, RenderScope, HeaderRenderScope } from "@/components/ProTable/interface";
import { filterEnum, formatValue, handleProp, handleRowAccordingToProp } from "@/utils";
 
defineProps<{ column: ColumnProps }>();
 
const slots = useSlots();
 
const enumMap = inject("enumMap", ref(new Map()));
 
// 渲染表格数据
// 渲染表格数据
const renderCellData = (item: ColumnProps, scope: RenderScope<any>) => {
  const value = handleRowAccordingToProp(scope.row, item.prop!);
 
  // 如果值为 null 或 undefined,返回 "--"
  if (value === null || value === undefined || value === "null" || value === "") return "--";
 
  return enumMap.value.get(item.prop) && item.isFilterEnum
    ? filterEnum(value, enumMap.value.get(item.prop)!, item.fieldNames)
    : formatValue(value);
};
// 获取 tag 类型
const getTagType = (item: ColumnProps, scope: RenderScope<any>) => {
  return (
    filterEnum(handleRowAccordingToProp(scope.row, item.prop!), enumMap.value.get(item.prop), item.fieldNames, "tag") || "primary"
  );
};
 
const RenderTableColumn = (item: ColumnProps) => {
  return (
    <>
      {item.isShow && (
        <el-table-column
          {...item}
          align={item.align ?? "center"}
          showOverflowTooltip={item.showOverflowTooltip ?? item.prop !== "operation"}
        >
          {{
            default: (scope: RenderScope<any>) => {
              if (item._children) return item._children.map(child => RenderTableColumn(child));
 
              // 先获取值并检查是否为 null/undefined/"null"
              const value = item.prop ? handleRowAccordingToProp(scope.row, item.prop) : null;
              const isEmpty = value === null || value === undefined || value === "null" || value === "-1" || value === "";
 
              // 如果是空值,直接返回 "--"
              if (isEmpty && item.prop) return "--";
 
              // 自定义渲染
              if (item.render) return item.render(scope);
              if (item.prop && slots[handleProp(item.prop)]) return slots[handleProp(item.prop)]!(scope);
              if (item.tag) return <el-tag type={getTagType(item, scope)}>{renderCellData(item, scope)}</el-tag>;
              return renderCellData(item, scope);
            },
            header: (scope: HeaderRenderScope<any>) => {
              if (item.headerRender) return item.headerRender(scope);
              if (item.prop && slots[`${handleProp(item.prop)}Header`]) return slots[`${handleProp(item.prop)}Header`]!(scope);
              return item.label;
            }
          }}
        </el-table-column>
      )}
    </>
  );
};
</script>