欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vxe-table、vxe-grid合并行配置項生成方式

 更新時間:2025年04月24日 16:57:25   作者:GuMoYu  
這篇文章主要介紹了vxe-table、vxe-grid合并行配置項生成方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

vxe-table、vxe-grid合并行方法配置項生成方法

更多詳情配置可見vxe-grid官網(wǎng)

配置項規(guī)則說明

mergeCells:[{ "row": 0, "col": 2, "rowspan": 3, "colspan": 1 },.....]

vxe表格合并單元格的配置對象中,mergeCells 屬性用于定義如何合并單元格。

有四個關(guān)鍵字段,它們的意義分別如下:

  • row: 表示合并起始的行索引(從0開始計數(shù))。在這個例子中,合并起始于第0行。
  • col: 表示合并起始的列索引(同樣從0開始計數(shù))。這里,合并起始于第2列。
  • rowspan: 定義了合并的行數(shù),即從起始行向下合并的行數(shù)。例如,"rowspan": 3 意味著從第0行開始,總共合并3行。
  • colspan: 定義了合并的列數(shù),即從起始列向右合并的列數(shù)。在此例中,"colspan": 1 表示只合并1列,即不跨列合并,因為通常跨度為1默認不顯示,但在此結(jié)構(gòu)中用于精確指定。

例子中的這個配置將導(dǎo)致從表格的第0行第2列開始,向下合并3行,同時保持列寬不變(即不跨列合并)

生成配置項集合通用方法

/**
 * 設(shè)置表格合并行的公共方法
 * @param {any[]} list 表格數(shù)據(jù)
 * @param {any[]} columns 表頭
 * @param {String[]} merges 要合并的列字段名組成的數(shù)組
 * @param {String[]} condition 判斷條件的字段名組成的數(shù)組
 * @param {String} field 表頭取值的字段名
 */
export function setMergeCells({ list = [], columns = [], merges = [], condition = [], field = 'field' }) {
  const validMap = new Map(); // 有效合并配置項
  for (let i = 0; i < list.length; i++) {
    // 根據(jù)判斷條件取出當前行對應(yīng)的表格數(shù)據(jù),生成唯一標識
    const hashKey = condition.map(field => list[i][field]).join('&&');
    let flag = true;
    let count = 1;
    // 從當前索引i開始,往后找,數(shù)據(jù)相同的話,count自增,否則跳出while循環(huán)
    while (flag && i + count < list.length) {
      // 根據(jù)判斷條件取出下一行的表格數(shù)據(jù),生成唯一標識
      const nextRow = condition.map(field => list[i + count][field]).join('&&');
      if (hashKey === nextRow) {
        // 數(shù)據(jù)相同,count自增
        count++;
      } else {
        // 數(shù)據(jù)不同,跳出while循環(huán)
        flag = false;
      }
    }
    // 將有效的合并配置項存入validMap
    count > 1 && validMap.set(hashKey + '_' + i, { row: i, rowspan: count });
    // i 跳過已合并的行,減 1 是因為 i++
    i += count - 1;
    // 重置 while 循環(huán)標識
    flag = true;
  }
  // 合并記錄轉(zhuǎn)換
  const recordsList = [...validMap.values()];
  if (recordsList.length == 0) {
    return [];
  }
  // 預(yù)處理列索引
  const cols = merges.reduce((acc, mergeField) => {
    const idx = columns.findIndex(item => item[field] === mergeField);
    idx !== -1 && acc.push(idx);
    return acc;
  }, []);
  // 遍歷列索引,生成合并單元格配置集合
  const mergeCells = recordsList.flatMap(({ row, rowspan }) => cols.map(col => ({ row, col, rowspan, colspan: 1 })));
  return mergeCells;
}

方法簡述

此方法 setMergeCells 的目的是根據(jù)給定的條件(condition)來合并表格中的行。

它接收一個對象作為參數(shù),該對象包含幾個關(guān)鍵屬性:

  • list(表格數(shù)據(jù)列表)
  • columns(列定義列表)、
  • merges(指定哪些列應(yīng)該被考慮合并的字段名列表)、
  • condition(用于判斷哪些行應(yīng)該被合并的條件字段名列表)、
  • field(用于在列定義中查找字段名的鍵名,默認為 'field')。

方法最終返回一個合并單元格的配置集合。

以下是該方法的詳細解析:

1.初始化:

  • 創(chuàng)建一個 Map 對象 validMap
  • 用于存儲有效的合并配置項

2.遍歷數(shù)據(jù)行:

  • 遍歷 list 中的每一行。
  • 對于每一行,根據(jù) condition 字段列表生成一個唯一標識 hashKey,該標識是通過將當前行中 condition 指定的字段值連接(使用 '&&' 作為分隔符)得到的。
  • 使用一個 while 循環(huán)從當前行開始向后查找,直到找到與當前行 hashKey 不相同的行或到達列表末尾。
  • 在這個過程中,如果找到與當前行 hashKey 相同的行,則計數(shù)器 count 自增。
  • 一旦找到不同的行或到達列表末尾,將有效的合并配置項(如果有多于一行的相同數(shù)據(jù))存入 validMap。配置項包括起始行號 row 和需要合并的行數(shù) rowspan
  • 更新當前行索引 i,跳過已合并的行。

3.合并記錄轉(zhuǎn)換:

  • validMap 中的值(合并配置項)轉(zhuǎn)換為一個數(shù)組 recordsList。
  • 如果沒有有效的合并配置項,則直接返回空數(shù)組。

4.預(yù)處理列索引:

  • 遍歷 merges 列表,找到每個需要合并的字段在 columns 中的索引,并將這些索引存儲在 cols 數(shù)組中。

5.生成合并單元格配置集合:

  • 使用 flatMap 遍歷 recordsList 中的每個合并配置項,并對每個配置項中的每個列索引(cols 數(shù)組中的元素)生成一個合并單元格配置對象。
  • 配置對象包括起始行號 row、列索引 col、需要合并的行數(shù) rowspan 以及列跨度 colspan(這里固定為 1,因為方法主要處理行合并)。
  • 最終返回所有合并單元格配置對象的集合。

此方法根據(jù)某些條件自動合并具有相同數(shù)據(jù)的行,以便于在前端表格展示時減少冗余數(shù)據(jù),提高可讀性。

通過指定哪些列應(yīng)該被考慮合并(merges)和哪些字段用于判斷行是否應(yīng)該合并(condition),提供了靈活的合并邏輯。

該方法在時間復(fù)雜度上的簡析

1.遍歷數(shù)據(jù)行:

  • 外層循環(huán)遍歷list中的每一行,這需要O(n)的時間,其中nlist的長度。

2.內(nèi)部while循環(huán):

  • 對于list中的每一行,內(nèi)部while循環(huán)用于查找連續(xù)的相同行。在最壞的情況下,這個循環(huán)可能會遍歷到list的末尾(如果所有行都相同),但在平均情況下,它可能只遍歷幾行。然而,為了進行時間復(fù)雜度分析,我們需要考慮最壞情況,即每一輪外層循環(huán)內(nèi)部的while循環(huán)都會遍歷剩余的n-i行(其中i是當前外層循環(huán)的索引)。
  • 如果我們假設(shè)在最壞情況下,每一行都與前一行相同(除了最后一行),那么while循環(huán)的總時間復(fù)雜度將是O(n) + O(n-1) + O(n-2) + ... + O(1),這是一個等差數(shù)列的和,其和為O(n^2)。

3.Map操作和記錄轉(zhuǎn)換:

  • 將合并配置項添加到validMap中以及后續(xù)從validMap轉(zhuǎn)換到recordsList數(shù)組的操作,其時間復(fù)雜度與validMap的大小成正比,但由于validMap的大小受list中相同行的數(shù)量影響,且在最壞情況下可以達到O(n)(如果所有行都不同),因此這部分的復(fù)雜度可以視為O(n)。然而,由于前面while循環(huán)的O(n^2)復(fù)雜度,這個O(n)在這里是可以忽略的。

4.預(yù)處理列索引:

  • 遍歷merges列表并查找每個元素在columns中的索引是一個O(m*k)的操作,其中mmerges的長度,kcolumns的長度。
  • 由于mk通常遠小于n,并且不依賴于n,因此這部分的復(fù)雜度可以視為常數(shù)時間或O(1)(在n的上下文中)。

5.生成合并單元格配置集合:

  • 這部分操作的時間復(fù)雜度與recordsList的大小和cols的長度成正比。
  • 在最壞情況下,recordsList的大小可以達到O(n)(如果所有行都不同,則沒有合并),而cols的長度是常數(shù)。因此,這部分的復(fù)雜度可以視為O(n)。然而,同樣由于前面while循環(huán)的O(n^2)復(fù)雜度,這個O(n)在這里也是可以忽略的。

綜上所述,setMergeCells函數(shù)的時間復(fù)雜度主要由內(nèi)部while循環(huán)決定,為O(n^2)。這是因為在最壞情況下,內(nèi)部while循環(huán)需要為list中的每一行都遍歷剩余的所有行來查找連續(xù)的相同行。其他操作的時間復(fù)雜度在這個上下文中是可以忽略的。

使用示例

以vue為示例模板

<template>
  <vxe-grid ref="xGrid" v-bind="gridOptions" />
</template>

<script>
export default {
  data() {
    return {
      gridOptions: {
        // ...otherParmas,
        mergeCells: [],
        columns: [
          { field: 'sex', title: '性別' },
          { field: 'name', title: '姓名' },
          { field: 'idCard', title: '身份證' },
          { field: 'time', title: '時間' }
          // ...otherColumns,
        ],
        data: [
          // ...otherData,項目中一般是異步請求數(shù)據(jù)
          { id: 10001, sex: 'xxxx', name: 'xxxx', idCard: 'xxxx', time: 'xxxx' }
        ]
      }
    };
  },
  created() {
    // 請求數(shù)據(jù)后執(zhí)行合并方法
    this.setRowSpans()
  },
  methods: {
    // 合并單元格
    setRowSpans() {
      const options = {
        list: this.gridOptions.data, // 表格數(shù)據(jù)
        columns: this.gridOptions.columns, // 完整表頭
        merges: ['sex', 'name'], // 需要合并的列
        condition: ['idCard'], // 合并條件
        field: 'field' // 表頭取值的字段
      };
      // 傳入此配置項,是指將idCard相等的相鄰數(shù)據(jù)合并,如果兩條數(shù)據(jù)不相鄰即使idCard相等也不會合并
      this.mergeCells = setMergeCells(options);
      console.log('this.mergeCells: ', this.mergeCells);
    }
  }
};
</script>

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue.js 中 axios 跨域訪問錯誤問題及解決方法

    Vue.js 中 axios 跨域訪問錯誤問題及解決方法

    這篇文章主要介紹了Vue.js 中 axios 跨域訪問錯誤問題及解決方法,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-11-11
  • vue中vite.config.js配置跨域以及環(huán)境配置方式

    vue中vite.config.js配置跨域以及環(huán)境配置方式

    這篇文章主要介紹了vue中vite.config.js配置跨域以及環(huán)境配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue2利用Bus.js如何實現(xiàn)非父子組件通信詳解

    vue2利用Bus.js如何實現(xiàn)非父子組件通信詳解

    這篇文章主要給大家介紹了關(guān)于vue2利用Bus.js如何實現(xiàn)非父子組件通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。
    2017-08-08
  • Uniapp設(shè)置頁面的背景圖片方法代碼

    Uniapp設(shè)置頁面的背景圖片方法代碼

    這篇文章主要給大家介紹了關(guān)于Uniapp設(shè)置頁面的背景圖片,uni-app中設(shè)置背景圖有兩種方式,分別是全局設(shè)置和在相應(yīng)的view內(nèi)設(shè)置背景,文中給出了代碼示例,需要的朋友可以參考下
    2024-03-03
  • 利用Dectorator分模塊存儲Vuex狀態(tài)的實現(xiàn)

    利用Dectorator分模塊存儲Vuex狀態(tài)的實現(xiàn)

    這篇文章主要介紹了利用Dectorator分模塊存儲Vuex狀態(tài)的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue駝峰與短橫線分割命名中有哪些坑

    Vue駝峰與短橫線分割命名中有哪些坑

    這篇文章主要介紹了Vue駝峰與短橫線分割命名中的注意事項,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02
  • Vue中$router與?$route的區(qū)別詳解

    Vue中$router與?$route的區(qū)別詳解

    這篇文章主要介紹了Vue中$router與?$route的區(qū)別詳解,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • Vue實現(xiàn)購物車場景下的應(yīng)用

    Vue實現(xiàn)購物車場景下的應(yīng)用

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)購物車場景下的應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 關(guān)于vue的語法規(guī)則檢測報錯問題的解決

    關(guān)于vue的語法規(guī)則檢測報錯問題的解決

    在配置路有的時候,陸續(xù)出現(xiàn)了各種報錯其中最多的是一些寫法,例如空格,縮進,各種括號,這篇文章主要介紹了關(guān)于vue的語法規(guī)則檢測報錯問題的解決,非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • vue-router:嵌套路由的使用方法

    vue-router:嵌套路由的使用方法

    本篇文章主要介紹了vue-router:嵌套路由的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論