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

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默認(rèn)不顯示,但在此結(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ù)判斷條件取出當(dāng)前行對應(yīng)的表格數(shù)據(jù),生成唯一標(biāo)識
    const hashKey = condition.map(field => list[i][field]).join('&&');
    let flag = true;
    let count = 1;
    // 從當(dāng)前索引i開始,往后找,數(shù)據(jù)相同的話,count自增,否則跳出while循環(huán)
    while (flag && i + count < list.length) {
      // 根據(jù)判斷條件取出下一行的表格數(shù)據(jù),生成唯一標(biāo)識
      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)標(biāo)識
    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(用于在列定義中查找字段名的鍵名,默認(rèn)為 'field')。

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

以下是該方法的詳細(xì)解析:

1.初始化:

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

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

  • 遍歷 list 中的每一行。
  • 對于每一行,根據(jù) condition 字段列表生成一個唯一標(biāo)識 hashKey,該標(biāo)識是通過將當(dāng)前行中 condition 指定的字段值連接(使用 '&&' 作為分隔符)得到的。
  • 使用一個 while 循環(huán)從當(dāng)前行開始向后查找,直到找到與當(dāng)前行 hashKey 不相同的行或到達(dá)列表末尾。
  • 在這個過程中,如果找到與當(dāng)前行 hashKey 相同的行,則計數(shù)器 count 自增。
  • 一旦找到不同的行或到達(dá)列表末尾,將有效的合并配置項(如果有多于一行的相同數(shù)據(jù))存入 validMap。配置項包括起始行號 row 和需要合并的行數(shù) rowspan。
  • 更新當(dāng)前行索引 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的末尾(如果所有行都相同),但在平均情況下,它可能只遍歷幾行。然而,為了進(jìn)行時間復(fù)雜度分析,我們需要考慮最壞情況,即每一輪外層循環(huán)內(nèi)部的while循環(huán)都會遍歷剩余的n-i行(其中i是當(dāng)前外層循環(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ù)量影響,且在最壞情況下可以達(dá)到O(n)(如果所有行都不同),因此這部分的復(fù)雜度可以視為O(n)。然而,由于前面while循環(huán)的O(n^2)復(fù)雜度,這個O(n)在這里是可以忽略的。

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

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

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

  • 這部分操作的時間復(fù)雜度與recordsList的大小和cols的長度成正比。
  • 在最壞情況下,recordsList的大小可以達(dá)到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中的$nextTick

    全面解析Vue中的$nextTick

    這篇文章主要介紹了Vue中的$nextTick的相關(guān)資料,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-12-12
  • 利用Vue3實現(xiàn)拖拽定制化首頁功能

    利用Vue3實現(xiàn)拖拽定制化首頁功能

    vue3正式版已經(jīng)發(fā)布大半年了,咱也得緊跟時代潮流,vue3帶來的很多改變,下面這篇文章主要給大家介紹了關(guān)于利用Vue3實現(xiàn)拖拽定制化首頁功能的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 基于 Vue 實現(xiàn)一個酷炫的 menu插件

    基于 Vue 實現(xiàn)一個酷炫的 menu插件

    本文給大家介紹基于 Vue 實現(xiàn)一個酷炫的 menu插件,此篇教程需要大家具備一定的css和vue基礎(chǔ)知識,本文分步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-11-11
  • 詳解從新建vue項目到引入組件Element的方法

    詳解從新建vue項目到引入組件Element的方法

    本篇文章主要介紹了詳解從新建vue項目到引入組件Element的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • vue實現(xiàn)鼠標(biāo)滑動預(yù)覽視頻封面組件示例詳解

    vue實現(xiàn)鼠標(biāo)滑動預(yù)覽視頻封面組件示例詳解

    這篇文章主要為大家介紹了vue實現(xiàn)鼠標(biāo)滑動預(yù)覽視頻封面組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • element中使用formdata進(jìn)行上傳文件的方法

    element中使用formdata進(jìn)行上傳文件的方法

    本文主要介紹了elementUI中使用formdata進(jìn)行上傳文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Vue之自定義指令使用及解讀(v-permission)

    Vue之自定義指令使用及解讀(v-permission)

    文章介紹了如何在Vue中創(chuàng)建和使用自定義指令(v-permission)來實現(xiàn)按鈕權(quán)限控制,通過在`src/directives`目錄下創(chuàng)建`permission.js`文件并定義指令,然后在`index.js`中引入并全局注冊該指令,最后在`main.js`中引入`index.js`,即可在項目中使用自定義指令
    2026-03-03
  • 基于Vue封裝實現(xiàn)全屏功能工具類

    基于Vue封裝實現(xiàn)全屏功能工具類

    在?Web?應(yīng)用程序中,有時需要為某些內(nèi)容提供全屏顯示的功能,本文將介紹如何使用?Vue.js?3?的?Composition?API?創(chuàng)建一個全屏功能的工具類,希望對大家有所幫助
    2024-03-03
  • Vue中video標(biāo)簽如何實現(xiàn)不靜音自動播放

    Vue中video標(biāo)簽如何實現(xiàn)不靜音自動播放

    最近在做大屏展示需要在一開始播放引導(dǎo)視頻,產(chǎn)生自動播放需求,下面這篇文章主要給大家介紹了關(guān)于Vue中video標(biāo)簽如何實現(xiàn)不靜音自動播放的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • vue項目實現(xiàn)記住密碼到cookie功能示例(附源碼)

    vue項目實現(xiàn)記住密碼到cookie功能示例(附源碼)

    本篇文章主要介紹了vue項目實現(xiàn)記住密碼到cookie功能示例(附源碼),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

加查县| 吴忠市| 越西县| 仪征市| 精河县| 长顺县| 德安县| 江阴市| 武汉市| 错那县| 东丽区| 友谊县| 佛坪县| 江油市| 老河口市| 金沙县| 大新县| 英德市| 荣成市| 邛崃市| 福清市| 临汾市| 绍兴县| 大同市| 来宾市| 潜江市| 赣州市| 和顺县| 卢湾区| 定结县| 讷河市| 仁寿县| 济阳县| 大兴区| 原阳县| 乌拉特前旗| 泰州市| 天祝| 崇义县| 报价| 锡林浩特市|