Wiidede's blog Wiidede's blog
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)

Wiidede

小的的写前端
  • 前端
  • Python
  • 算法
  • 生活
  • 其他
  • 分类
  • 标签
  • 归档
  • 关于我
  • 赞赏
  • 我的小站 (opens new window)
GitHub (opens new window)
  • 整理一些css样式
  • vue隔代组件层层动态插槽并且附带数据
  • vue判断字符串是否溢出来显示弹窗、解决el-table tooltip 内过多导致无法显示,内容闪烁
  • 整理一些js写法
  • ElementUI timePicker 增加此刻按钮 引发的dom操作的学习
  • 毕业设计(水表识别)前端知识整理
  • html小知识
  • axios请求api然后下载文件
  • vue3+ts根据高度改变元素的透明度
  • vue3 + ElementPlus 换肤方案(Css变量)
  • Moment的一些使用方法
  • echarts基础vue组件
  • element UI el-date-picker 年月日切换组件
  • 可以不选择的el-radio单选框
  • vue的小技巧总结
  • 全局动态权限判断(Vue指令)
  • vue-anchor 探索
  • Deep Dive with Evan You 笔记
  • 前端基础知识查漏补缺
  • WebPack 知识总结
  • 我写的一些可以日后参考的代码
  • 接口变化后,封装接口函数,改变返回内容
  • 项目组件整理
  • 前端框架设计想发
  • 全局进度条
  • 带有token的图片vue组件:authImg,使用axios下载图片
  • 前端npm包推荐
  • 给ElInputNumber添加prefix
  • ElPagination添加页数总数
  • el-tab做成chrome类似的tab样式
  • vue-grid-layout-组件配置
  • 项目数据字典封装
  • 图表组件响应式探索
  • ElementPlus表格table列自动合并composition
  • 简单的curd组件封装
  • ElementPlus表格自定义合计列composition
  • 一些处理表格数据composition api
    • 检查表格某列是否重复,并返回重复的值
    • 将层级为2的树展开成表格
  • div内容溢出后,内容向左悬浮,vue组件封装
  • 文本数字溢出后,按比例缩小,vue组件封装
  • 表格使用async-validator检验composition
  • ElementPlus Form一些简单的组件整合
  • arco-design快速使用tailwind的颜色、unocss动态颜色
  • 前端
wiidede
2023-01-16

一些处理表格数据composition api

# 一些处理表格数据composition api

# 检查表格某列是否重复,并返回重复的值

export const useTableColDuplicate = <Data>(tableData?: Data[] | Ref<Data[]>, key?: keyof Data) => {
  const valueTemp = ref(new Set<Data[keyof Data]>());
  const duplicateValues = computed(() => Array.from(valueTemp.value));
  const isDuplicate = computed(() => !!duplicateValues.value.length);
  watch(() => tableData, (val) => {
    if (!val || !key) {
      return;
    }
    valueTemp.value.clear();
    const data = isRef(val) ? val.value : val;
    const values = data.map((i) => i[key]);
    values.forEach((value) => {
      if (values.lastIndexOf(value) !== values.indexOf(value)) {
        valueTemp.value.add(value);
      }
    });
  }, {
    deep: true,
  });

  return {
    isDuplicate,
    duplicateValues,
  };
};
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

# 将层级为2的树展开成表格

const shallowTreeTableMap = new WeakMap();
export const useShallowTreeTable = <Data extends Record<string, unknown>, ChildKey extends keyof Data>(tree: Data[], childKey: ChildKey) => {
  type Child = (Data[ChildKey] & any[])[number]
  type TreeChildKey = Extract<keyof Child, string>
  type TableChildKey = `childTable_${TreeChildKey}`
  type TableRow = Record<TreeChildKey | TableChildKey | 'isMain', unknown>
  const table = ref<TableRow[]>([]) as Ref<TableRow[]>;
  if (!tree || !childKey) {
    return table;
  }
  if (shallowTreeTableMap.has(tree)) {
    return shallowTreeTableMap.get(tree) as typeof table;
  }
  shallowTreeTableMap.set(tree, table);
  let tableEdit = false;
  let treeEdit = false;
  watch(() => tree, (value) => {
    if (treeEdit) {
      treeEdit = false;
      return;
    }
    const list: TableRow[] = [];
    if (!value || !childKey) {
      return;
    }
    value?.forEach((parent) => {
      const children = parent[childKey];
      if (!Array.isArray(children)) return;
      children?.forEach((child, index) => {
        list.push({
          ...parent,
          isMain: index === 0,
          ...Object.fromEntries(Object.entries(child).map(([key, value]) => [`childTable_${key}`, value])),
        });
      });
    });
    tableEdit = true;
    table.value = list;
  }, {
    immediate: true,
    deep: true,
  });
  watch(table, (value) => {
    if (tableEdit) {
      tableEdit = false;
      return;
    }
    const list: Data[] = [];
    if (!value || !childKey) return;
    let current: (typeof list)[number];
    value.forEach((rowDetail) => {
      const { isMain, ...row } = rowDetail;
      const subList = Object.fromEntries(Object.entries(row).filter(
        ([key]) => key.startsWith('childTable_'),
      ).map(
        ([key, value]) => ([key.replace('childTable_', ''), value]),
      )) as Record<TreeChildKey, unknown>;
      const raw = Object.fromEntries(Object.entries(row).filter(([key]) => !key.startsWith('childTable_'))) as Data;
      if (isMain) {
        current = raw;
        raw[childKey] = [subList] as Data[ChildKey];
        list.push(raw);
      } else {
        (current?.[childKey] as (typeof subList)[])?.push(subList);
      }
    });
    treeEdit = true;
    tree.splice(0, tree.length, ...list);
  }, {
    deep: true,
  });
  return table;
};
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
73
#Composition#Vue
上次更新: 2023/06/01, 12:40:50

← ElementPlus表格自定义合计列composition div内容溢出后,内容向左悬浮,vue组件封装→

Theme by Vdoing | Copyright © 2021-2023 Wiidede | Website use MIT License | Article content & logo use CC-BY-SA-4.0 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式