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

Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法代碼詳解

 更新時間:2023年09月26日 15:42:21   作者:temperate__  
el-table是element-ui提供的表格組件,可以用于展示和操作數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法的相關(guān)資料,需要的朋友可以參考下

合并單元格

記錄一下工作時遇到的 el-table 合并單元格的需求,超詳細??

el-table官方提供了合并單元格的方法與返回格式 如下:

根據(jù)敘述有了如下思路:

因為后端返回的數(shù)據(jù)非統(tǒng)一, 可能不是按照類別排好的??, 所以官網(wǎng)的例子滿足不了所有的需求所以我們通過遍歷table的數(shù)據(jù)比較前后兩個元素是否相等, 來構(gòu)造一個spanArr用來存放rowspan, 最后通過rowspan的值來判斷colspan的值??.

案例如下, 這是我需要處理的一個表格:

需要根據(jù)數(shù)據(jù)動態(tài)的合并

對應(yīng)的配置數(shù)組為

處理數(shù)據(jù)

因為獲取的數(shù)據(jù)的非統(tǒng)一性, 我們首先要將數(shù)據(jù)根據(jù)我們想要合并的字段進行排序分組, 這里我實現(xiàn)了一個簡單的方法來處理數(shù)據(jù):

// data 為 表格數(shù)據(jù) , params 為需要合并的字段
groupBy (data, params) {
    const groups = {};
    data.forEach(v => {
    	// 獲取data中的傳入的params屬性對應(yīng)的屬性值
        const group = JSON.stringify(v[params]);
        // 把group作為groups的key,初始化value,循環(huán)時找到相同的v[params]時不變
        groups[group] = groups[group] || [];
        // 將對應(yīng)找到的值作為value放入數(shù)組中
        groups[group].push(v);
    })
    // 返回處理好的二維數(shù)組
    return Object.values(groups);
},

此時打印一下我們的數(shù)據(jù) console.log(this.groupBy(this.tableListData.items, 'FirstIndex'))

如圖, 我們已經(jīng)將數(shù)據(jù)分好組并合并在一個數(shù)組中啦, FirstIndex 相同的在一個數(shù)組

構(gòu)造控制合并的數(shù)組spanArr

這里實現(xiàn)了一個方法, 用來構(gòu)造一個 spanArr 數(shù)組賦予 rowspan ,即控制行合并

  • 接收重構(gòu)數(shù)組 let arr = []
  • 設(shè)置索引 let pos = 0
  • 控制合并的數(shù)組 this.spanArr = []

先將groupby()處理好的數(shù)據(jù)再次用arr進行處理:連接所有數(shù)組成員為一個新數(shù)組 this.groupBy(this.tableListData.items, 'FirstIndex').map(v => (arr = arr.concat(v)))

現(xiàn)在處理好了數(shù)據(jù),需要賦予原數(shù)據(jù)了:this.tableListData.items = arr

但是因為我是寫在 getSpanArr(data, params) 方法中的,已經(jīng)通過形參data將 this.tableListData.items傳入了這里,如果想方便封裝調(diào)用的話,不用每次使用都需要再次寫入 this.tableListData.items = arr于是想到一個辦法,js數(shù)組的shift()和push()是直接修改數(shù)組所占內(nèi)存的方法。

所以有:

arr.map(res => {
    // 每次遍歷都刪除data && this.tableListData.items的第一個元素
    data.shift()
    // 每次遍歷都將arr數(shù)組元素對應(yīng)push進 data && this.tableListData.items
    data.push(res)
})

還需要定義一個 redata 存放arr要合并字段的valueconst redata = arr.map(v => v[params])

reduce處理spanArr數(shù)組 ??

使用 reduce 方法比較redata前后兩個元素是否相等,相等的話spanArr中對應(yīng)索引的元素的值+1,并且在其后增加一個0占位(防止合并過后表格數(shù)據(jù)錯位),否則的話增加一個1占位,并記錄當前索引,往復(fù)循環(huán),構(gòu)造一個給 rowspan 取值判斷合并的數(shù)組:

  const redata = arr.map(v => v[params])
  redata.reduce((old, cur, i) => {
    // old 上一個元素  cur 當前元素  i 索引
    if (i === 0) {
      // 第一次判斷先增加一個 1 占位 ,索引為0 
      this.spanArr.push(1)
      pos = 0
    } else {
      if (cur === old) {
        this.spanArr[pos] += 1
        this.spanArr.push(0)
      } else {
        this.spanArr.push(1)
        pos = i
      }
    }
    return cur
  }, {})

看一下現(xiàn)在的數(shù)據(jù) spanArr , 這里傳的參數(shù)為 SecondIndex , 即表格的第二列

數(shù)組中大于0的數(shù)字就是我們數(shù)據(jù)中要合并的這組數(shù)據(jù)的數(shù)量, 同時也是這組數(shù)據(jù)需要合并的列數(shù),而0就是代表這列不合并, 依次遍歷,實現(xiàn)合并所選字段這一列的最終目的

如圖理解:

返回最終結(jié)果

最后一步啦??根據(jù)官方給的方法把我們處理好的spanArr傳給rowspan即可

spanMethod({ row, column, rowIndex, columnIndex }) {
  // 第一列
  if (columnIndex === 0) {
    const _row = this.spanArr[rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col
    }
  }
}

效果如圖!

完整代碼

就很nice, ??!最后把完整代碼貼上:

// ......
    mounted() {
      this.getSpanArr(this.tableListData.items, 'FirstIndex');
    },
    methods: {
      groupBy (data, params) {
        const groups = {}
        data.forEach(v => {
          const group = JSON.stringify(v[params])
          groups[group] = groups[group] || []
          groups[group].push(v)
        })
        return Object.values(groups)
      },
      getSpanArr (data, params) {
        let arr = []
        let pos = 0
        this.spanArr = []
        this.groupBy(data, params).map(v => (arr = arr.concat(v)))
        arr.map(res => {
          data.shift()
          data.push(res)
        })
        const redata = arr.map(v => v[params])
        redata.reduce((old, cur, i) => {
          if (i === 0) {
            this.spanArr.push(1)
            pos = 0
          } else {
            if (cur === old) {
              this.spanArr[pos] += 1
              this.spanArr.push(0)
            } else {
              this.spanArr.push(1)
              pos = i
            }
          }
          return cur
        }, {})
      },
      spanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
          const _row = this.spanArr[rowIndex];
          const _col = _row > 0 ? 1 : 0;
          return {
            rowspan: _row,
            colspan: _col
          }
        }
      }
    }

完美! 撒花?。?!??????

總結(jié)

到此這篇關(guān)于Vue+Element-UI中el-table動態(tài)合并單元格:span-method方法的文章就介紹到這了,更多相關(guān)el-table動態(tài)合并單元格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 封裝 axios+promise通用請求函數(shù)操作

    封裝 axios+promise通用請求函數(shù)操作

    這篇文章主要介紹了封裝 axios+promise通用請求函數(shù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue使用keep-alive實現(xiàn)數(shù)據(jù)緩存不刷新

    vue使用keep-alive實現(xiàn)數(shù)據(jù)緩存不刷新

    這篇文章主要介紹了vue使用keep-alive實現(xiàn)數(shù)據(jù)緩存不刷新,這里整理了詳細的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • vue使用import.meta.glob動態(tài)導(dǎo)入多個模塊方式

    vue使用import.meta.glob動態(tài)導(dǎo)入多個模塊方式

    文章介紹了Vite提供的`import.meta.glob`功能,用于動態(tài)導(dǎo)入多個模塊,它通過glob模式匹配文件,返回一個對象,鍵為文件路徑,值為返回Promise的動態(tài)導(dǎo)入函數(shù),支持eager模式直接導(dǎo)入和as選項指定導(dǎo)入方式,如原始字符串或文件URL,適用于Vite或Rollup項目
    2025-10-10
  • vue+element-ui JYAdmin后臺管理系統(tǒng)模板解析

    vue+element-ui JYAdmin后臺管理系統(tǒng)模板解析

    這篇文章主要介紹了vue+element-ui JYAdmin后臺管理系統(tǒng)模板解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Vue開發(fā)環(huán)境中修改端口號的實現(xiàn)方法

    Vue開發(fā)環(huán)境中修改端口號的實現(xiàn)方法

    這篇文章主要介紹了Vue開發(fā)環(huán)境中修改端口號的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Vue實現(xiàn)前端頁面緩存的過程

    Vue實現(xiàn)前端頁面緩存的過程

    這篇文章主要介紹了Vue實現(xiàn)前端頁面緩存的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue.js實現(xiàn)一個自定義分頁組件vue-paginaiton

    Vue.js實現(xiàn)一個自定義分頁組件vue-paginaiton

    這篇文章主要為大家詳細介紹了Vue.js實現(xiàn)一個自定義分頁組件vue-paginaiton的具體代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Vue組件實現(xiàn)景深卡片輪播示例

    Vue組件實現(xiàn)景深卡片輪播示例

    這篇文章主要為大家介紹了Vue組件實現(xiàn)景深卡片輪播示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 使用vue實現(xiàn)一個電子簽名組件的示例代碼

    使用vue實現(xiàn)一個電子簽名組件的示例代碼

    這篇文章主要介紹了使用vue實現(xiàn)一個電子簽名組件的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • vue-cli-service不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件問題

    vue-cli-service不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件問題

    在Vue項目構(gòu)建過程中,如果遇到無法識別'vue-cli-service'命令的錯誤提示,通常是因為沒有全局安裝vue-cli,解決這個問題的步驟主要包括:首先檢查Vue版本,如果未安裝則先安裝Vue;其次全局安裝vue-cli;若在安裝過程中遇到cnpm命令找不到的情況
    2024-10-10

最新評論

临海市| 山西省| 盐亭县| 遂溪县| 承德县| 松溪县| 中牟县| 邵阳县| 云龙县| 和静县| 泰安市| 瓮安县| 扶绥县| 古丈县| 额尔古纳市| 高邮市| 北京市| 浦北县| 奉化市| 墨玉县| 曲周县| 昆明市| 吉木乃县| 吉木乃县| 江山市| 清徐县| 武邑县| 樟树市| 洛隆县| 新绛县| 凤台县| 卫辉市| 中西区| 宜黄县| 新建县| 云南省| 通山县| 广元市| 鲁山县| 永济市| 德钦县|