最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue2+vue3?Table表格合并通用代碼

 更新時(shí)間:2026年03月06日 10:58:24   作者:陶醉的松鼠  
在前端開發(fā)中,table組件用的應(yīng)該是最多的了,尤其是在后臺管理系統(tǒng)中表格更是常見,這篇文章主要介紹了vue2+vue3 Table表格合并通用代碼的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

之前在寫表格合并的時(shí)候非常痛苦,弄不明白合并的具體邏輯,我這里直接貼上通用方法,只需要配置合并規(guī)則就可以了,在這里不扯那么多過程,你完全可以拷貝回去立馬能用。

vue2 表格合并

<el-table
      :data="tableData"
     :span-method="(param)=>objectSpanMethod(param,tableData)"
      border
      style="width: 100%">
      <el-table-column
        prop="id"
        label="ID"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="amount1"
        sortable
        label="數(shù)值 1">
      </el-table-column>
      <el-table-column
        prop="amount2"
        sortable
        label="數(shù)值 2">
      </el-table-column>
      <el-table-column
        prop="amount3"
        sortable
        label="數(shù)值 3">
      </el-table-column>
    </el-table>
<script>
function filterArray(item) {
  const valueArray = this.rule.filter(prop => {
    return item[prop] === this.data[prop]
  })
  if (valueArray.length === this.rule.length) {
    return true
  } else {
    return false
  }
}
  export default {
    data() {
      return {
        tableData: [{
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987123',
          name: '王小虎',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987124',
          name: '王小虎',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987125',
          name: '王小虎',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987126',
          name: '王小虎',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }],
        spanRule: {
            rule: {
              0: ['department_name']   //表示第一列的合并規(guī)則
            }
      }
      };
    },
    methods: {
      // 表格合并
          objectSpanMethod({ row, column, rowIndex, columnIndex }, item) {
            if (Object.keys(this.spanRule.rule).includes(columnIndex.toString())) {
              // filter驗(yàn)證數(shù)組
              const currentTable = {
                rule: this.spanRule.rule[columnIndex],
                data: item[rowIndex]
              }
              // 該單元格是否被合并 true 合并, false : 不合并
              let chooseSpan = false
              if (rowIndex !== 0) {
                chooseSpan = filterArray.call(currentTable, item[rowIndex - 1])
              }
              if (chooseSpan) {
                return {
                  rowspan: 0,
                  colspan: 0
                }
              } else {
                return {
                  rowspan: item.filter(filterArray, currentTable).length,
                  colspan: 1
                }
              }
            }
          },
    }
  };
</script>


vue3 表格合并

vue3 hooks文件內(nèi)容

// 定義通用類型(支持任意表格數(shù)據(jù)類型)
export interface TableSpanRule {
    rule: Record<string, string[]>; // 列索引 → 合并字段列表
}

// 表格合并Hook
export function useTableSpan<T = Record<string, any>>(spanRule: TableSpanRule) {

    const filterArray = (
        currentTable: { rule: string[]; data: T },
        item: T
    ): boolean => {
        const valueArray = currentTable.rule.filter((prop) => {
            return item[prop] === currentTable.data[prop];
        });
        return valueArray.length === currentTable.rule.length;
    };

    const objectSpanMethod = (
        param: {
            row: T;
            column: T;
            rowIndex: number;
            columnIndex: number;
        },
        tableData: T[]
    ) => {
        const { columnIndex, rowIndex } = param;
        // 判斷當(dāng)前列是否在合并規(guī)則中
        if (Object.keys(spanRule.rule).includes(columnIndex.toString())) {
            const currentTable = {
                rule: spanRule.rule[columnIndex],
                data: tableData[rowIndex]
            };
            let chooseSpan = false;
            // 非第一行時(shí)驗(yàn)證是否需要合并
            if (rowIndex !== 0) {
                chooseSpan = filterArray(currentTable, tableData[rowIndex - 1]);
            }
            // 需要合并則隱藏當(dāng)前單元格,否則設(shè)置合并行數(shù)
            if (chooseSpan) {
                return {
                    rowspan: 0,
                    colspan: 0
                };
            } else {
                return {
                    rowspan: tableData.filter((i) => filterArray(currentTable, i)).length,
                    colspan: 1
                };
            }
        }
        // 非合并列返回默認(rèn)值
        return {
            rowspan: 1,
            colspan: 1
        };
    };

    return {
        objectSpanMethod
    };
}

vue3 表格合并

<el-table
      :data="tableData"
     :span-method="(param)=>objectSpanMethod(param,tableData)" //這里非常重要,tableData字段是表格的數(shù)據(jù)
      border
      style="width: 100%">
      <el-table-column 
        prop="day"
        label="day"
        width="180">
      </el-table-column>
      <el-table-column
        prop="domainName"
        label="domainName">
      </el-table-column>
      <el-table-column
        prop="allPurchaseCount"
        sortable
        label="allPurchaseCount">
      </el-table-column>
      <el-table-column
        prop="allPurchaseValue"
        sortable
        label="allPurchaseValue">
      </el-table-column>
      <el-table-column
        prop="gaAmountUsd"
        sortable
        label="交易額">
      </el-table-column>
    </el-table>
const tableCol = [  //表格列
  {
    label: t('localeAudience.datetime'),
    prop: 'day',
    width: 120,
    sortable: "custom",
    formatter: (row: any, column: any, text: any) => {
      return text || "-";
    },
  },
  {
    label: t('localeAudience.domain'),
    width: 120,
    prop: 'domainName',
    'show-overflow-tooltip': true,
  },
  {
    label: t('localeAudience.allorders'),
    sortable: "custom",
    width: 120,
    prop: 'allPurchaseCount',
  },
  {
    label: t('localeAudience.allamount'),
    sortable: "custom",
    width: 140,
    prop: 'allPurchaseValue',
  },
  {
    label: '交易額',
    sortable: "custom",
    width: 180,
    prop: 'gaAmountUsd',
  },
];
const tableData = [ // 1.表格數(shù)據(jù)
  {
    day: '2023-08-01',
    domainName: 'example.com',
    allPurchaseCount: 10,
    allPurchaseValue: 1000,
    gaAmountUsd: 500,
  },
  {
    day: '2023-08-01',
    domainName: 'example.com',
    allPurchaseCount: 5,
    allPurchaseValue: 500,
    gaAmountUsd: 250,
  },
  {
    day: '2023-08-02',
    domainName: 'example.com',
    allPurchaseCount: 8,
    allPurchaseValue: 800,
    gaAmountUsd: 400,
  },
];
// 2. 定義列合并規(guī)則
const spanRule = {
  rule: {
    0: ['day','domainName','allPurchaseCount','allPurchaseValue'], //表示第1列的合并規(guī)則
    1: ['day','domainName','allPurchaseCount','allPurchaseValue'], //表示第2列的合并規(guī)則
    2: ['day','domainName','allPurchaseCount','allPurchaseValue'], //表示第3列的合并規(guī)則
    3: ['day','domainName','allPurchaseCount','allPurchaseValue'], //表示第4列的合并規(guī)則
  }
};

// 3. 使用表格合并Hook
const { objectSpanMethod } = useTableSpan(spanRule);

總結(jié) 

到此這篇關(guān)于vue2+vue3 Table表格合并通用代碼的文章就介紹到這了,更多相關(guān)vue2 vue3 Table表格合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中input type=file上傳后@change事件無效的解決方案

    vue中input type=file上傳后@change事件無效的解決方案

    這篇文章主要介紹了vue中input type=file上傳后@change事件無效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • element表格組件實(shí)現(xiàn)右鍵菜單的功能

    element表格組件實(shí)現(xiàn)右鍵菜單的功能

    本文主要介紹了element表格組件實(shí)現(xiàn)右鍵菜單的功能,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue移動(dòng)端輕量級的輪播組件實(shí)現(xiàn)代碼

    vue移動(dòng)端輕量級的輪播組件實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue移動(dòng)端輕量級的輪播組件實(shí)現(xiàn)代碼,一個(gè)簡單的移動(dòng)端卡片滑動(dòng)輪播組件,適用于Vue2.x。本文給大家?guī)砹藢?shí)例代碼,需要的朋友參考下吧
    2018-07-07
  • Vue+tracking.js 實(shí)現(xiàn)前端人臉檢測功能

    Vue+tracking.js 實(shí)現(xiàn)前端人臉檢測功能

    這篇文章主要介紹了Vue+tracking.js 實(shí)現(xiàn)前端人臉檢測功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解Vue3中useLocalStorage的用法

    詳解Vue3中useLocalStorage的用法

    這篇文章主要為大家詳細(xì)介紹了Vue3中useLocalStorage用法的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-10-10
  • undefined是否會變?yōu)閚ull原理解析

    undefined是否會變?yōu)閚ull原理解析

    這篇文章主要為大家介紹了undefined是否會變?yōu)閚ull原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Vue2和Vue3中常用組件通信用法分享

    Vue2和Vue3中常用組件通信用法分享

    這篇文章主要為大家整理了Vue3的8種和Vue2的12種組件通信的使用方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Vue有一定的幫助,值得收藏
    2023-04-04
  • Vue實(shí)現(xiàn)pdf在線預(yù)覽功能的示例代碼

    Vue實(shí)現(xiàn)pdf在線預(yù)覽功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Vue實(shí)現(xiàn)pdf在線預(yù)覽功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • 記錄--使用el-time-picker默認(rèn)值遇到的問題

    記錄--使用el-time-picker默認(rèn)值遇到的問題

    這篇文章主要介紹了記錄--使用el-time-picker默認(rèn)值遇到的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue.config.js完整配置教程

    vue.config.js完整配置教程

    這篇文章主要為大家介紹了vue.config.js的完整配置教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論

富阳市| 抚松县| 敖汉旗| 剑川县| 宣化县| 福海县| 互助| 石楼县| 尉犁县| 玉龙| 邯郸县| 高雄县| 读书| 富蕴县| 吴江市| 宁河县| 思南县| 浮梁县| 左权县| 韶山市| 尚义县| 宜昌市| 涞源县| 镇平县| 同江市| 桂阳县| 黔东| 余庆县| 武川县| 崇左市| 同德县| 清远市| 巴彦淖尔市| 怀集县| 哈尔滨市| 汉沽区| 鄱阳县| 南溪县| 区。| 凉山| 兴安盟|