日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

ant desing vue table 實現可伸縮列的完整例子

瀏覽:25日期:2022-09-29 10:46:28
完美解決ant-design-vue table 可伸縮列問題,實現在固定列,多級表頭情況下的伸縮列

這個東西本來以為手到擒來,因為在官網中已經給出了例子,但是果然還是不能太信任官方,官方給出來的只能是最基礎的,然后我們正常的使用場景往往要復雜很多,比如固定列, 比如固定表頭,比如自帶checkbox列,比如多級表頭的情況。要想滿足這些情況往往需要自行開發。

1.首先蔣官方的例子copy下來,居然拖不動。

對照了一下官方,css居然都不一樣,于是增加了第一個改動因為style內聯樣式自帶了 translate屬性,所以直接去掉right:0;只留left -5.height設置100%就可以。

.resize-table-th { position: relative; .table-draggable-handle { height: 100% !important; bottom: 0; left: -5px !important; cursor: col-resize; touch-action: none; position: absolute; } }

2.這回可以看到每次拖拽后translate屬性實時在變化,但是單元格并沒有變寬移動。

于是又是檢查了元素,發現th的width在變化,但是colGroup的width屬性沒有變。于是開啟了尋找對應的colGroup的子元素col之旅,最后找到了,然后就是一頓操作在draging的時候同時修改了 colGroup的col的width屬性。這樣就可以跟著變化了。

3.接下來我發現在固定列和固定表頭的情況下拉伸會出現bug。

查看代碼發現當為固定列或者固定表頭的情況下實際上thead和tbody是在不同的 table上,這時候就需要找到所有的colGroup測col,改變width。這樣就處理了固定表頭的拉伸。但是固定列的情況還是需要另外設置css ,找到table-fixed-left重新設置寬度。

下面是一些代碼

根據當前的th,判斷th是父元素的第幾個孩子節點,對應到colGroup的第幾個col節點

const loopDom = ss => { if (ss.previousSibling !== null) { thDomIndex++; loopDom(ss.previousSibling); }};

重新設置固定列的寬度(只處理了左浮動)

function resetFixedColumns(width) { const fixedHead = document.querySelector('.ant-table-fixed-left .ant-table-header'); const fixedBody = document.querySelector('.ant-table-fixed-left .ant-table-body-outer .ant-table-fixed'); if (fixedHead) { fixedHead.style.width = width + 'px'; fixedBody.style.width = width + 'px'; }}解決多級表頭伸縮列問題

遞歸遍歷數組,獲取寬度

getDraggingMap(tbCols, draggingMap) { tbCols.forEach(col => {if (col.children) { this.getDraggingMap(col.children, draggingMap);} else { const key = col.dataIndex || col.key; //這兒要求表格數據中要有這兩個屬性 draggingMap[key] = col.width || 0;} }); },

遞歸遍歷數組,獲取當前列(這個遞歸真的很煩,不知道你們寫遞歸是什么感受)

// 處理多級表頭 getRenderCoL(key, tbCols) { let result = ''; this._.forEach(tbCols, item => {if (item.children) { result = this.getRenderCoL(key, item.children); return !result;} else { const k = item.dataIndex || item.key; if (k === key) { result = item; return false; }} }); return result; }

遞歸遍歷數組, 獲取多級表頭操作列索引(同樣難以忍受的遞歸,開始少了最后一個renturn 一直跑不對,遞歸的陰影面積正無窮)

const loopDom = (cols, col) => { let tag = true; this._.forEach(cols, co => { if (co.dataIndex == col.dataIndex) { thDomIndex++; tag = false; return tag; } if (co.children) { tag = loopDom(co.children, col); return tag; } else { thDomIndex++; } }); return tag;};下面是完整代碼

這是一個js文件,通過mixin的方式引入table主文件, table 添加

:components='drag(columnKeys)'

//mixins/tableDragResize.jsimport Vue from 'vue';import VueDraggableResizable from 'vue-draggable-resizable';Vue.component('vue-draggable-resizable', VueDraggableResizable);export default { data() { return { maxLevel: 1 }; }, methods: { drag(columns) { return {header: { cell: this.initDrag(columns)} }; }, /** * @param { 表格columns } tbCols */ initDrag(tbCols) { let draggingMap = {}; this.getDraggingMap(tbCols, draggingMap, 1); let draggingState = Vue.observable(draggingMap); return (h, props, children) => {let thDomIndex = 0;const { key, ...restProps } = props;let col = {};// 處理多級表頭col = this.getRenderCoL(key, tbCols);if (!col || !col.width) { //這兒要求表格數據中要有寬width屬性,若是沒有是不會執行下面的拖拽的 return <th {...restProps}>{children}</th>;}const onDrag = x => { col.width = Math.max(x, 1); draggingState[key] = col.width; thDomIndex = 0; loopDom(tbCols, col); if (!this.attrBute.isCheck) { thDomIndex--; } let colgroup = document.querySelectorAll('colgroup'); colgroup.forEach(Element => { let childCol = Element.children; if (childCol[thDomIndex]) childCol[thDomIndex].style.width = col.width + 'px'; }); this.resetFixedColumns(col.width);};const loopDom = (cols, col) => { let tag = true; this._.forEach(cols, co => { if (co.dataIndex == col.dataIndex) { thDomIndex++; tag = false; return tag; } if (co.children) { tag = loopDom(co.children, col); return tag; } else { thDomIndex++; } }); return tag;};const onDragstop = () => {};return ( <th {...restProps} width={draggingState[key]} dataIndex={col.key}> {children} <vue-draggable-resizable key={col.dataIndex || col.key} w={20} h={this.getResizableHandler(col)} x={draggingState[key]} z={100} axis='x' draggable={true} resizable={false} onDragging={onDrag} onDragstop={onDragstop} ></vue-draggable-resizable> </th>); }; }, getResizableHandler(col) { // let baseH = thDom.getBoundingClientRect().height; let size = this.cellsize ? this.cellsize : this.attrBute.cellsize; let baseH = size == 'middle' ? 47 : size == 'small' ? 39 : 55; if (col.isEndNode) return baseH * col.nodeLevel; else if (col.leafNode && col.nodeLevel < this.maxLevel) {return baseH * this.maxLevel; } else return baseH; }, resetFixedColumns(width) { const fixedHead = document.querySelector('.ant-table-fixed-left .ant-table-header'); const fixedBody = document.querySelector('.ant-table-fixed-left .ant-table-body-outer .ant-table-fixed'); if (fixedHead) {fixedHead.style.width = width + 'px';fixedBody.style.width = width + 'px'; } }, getDraggingMap(tbCols, draggingMap, nodeLevel) { tbCols.forEach((col, index) => {col.nodeLevel = nodeLevel;col.isEndNode = index == tbCols.length - 1;this.maxLevel = Math.max(this.maxLevel, nodeLevel);if (col.children) { col.leafNode = false; this.getDraggingMap(col.children, draggingMap, nodeLevel + 1);} else { col.leafNode = true; const key = col.dataIndex || col.key; //這兒要求表格數據中要有這兩個屬性 draggingMap[key] = col.width || 0;} }); }, getRenderCoL(key, tbCols) { let result = ''; this._.forEach(tbCols, item => {if (item.children) { result = this.getRenderCoL(key, item.children); return !result;} else { const k = item.dataIndex || item.key; if (k === key) { result = item; return false; }} }); return result; } }};

后記 完美解決多級表頭的伸縮列 修改原getDraggingMap方法,增加nodeLevel 層級, isEndNode是否是蓋層級下最后一個節點, 以及this.maxLevel 記錄最大層級

getDraggingMap(tbCols, draggingMap, nodeLevel) {tbCols.forEach((col, index) => {col.nodeLevel = nodeLevel;col.isEndNode = index == tbCols.length - 1;this.maxLevel = Math.max(this.maxLevel, nodeLevel);if (col.children) {col.leafNode = false;this.getDraggingMap(col.children, draggingMap, nodeLevel + 1);} else {col.leafNode = true;const key = col.dataIndex || col.key; //這兒要求表格數據中要有這兩個屬性draggingMap[key] = col.width || 0;}});},

增加處理 table-draggable-handle的高度方法

看圖

ant desing vue table 實現可伸縮列的完整例子

可拖拽區域為紅色區域,為了達到這個效果,需要以下處理

首先去除css 中height :100%;然后在render時 設置組件高度如下

h={this.getResizableHandler(col)}

size 是表格尺寸

getResizableHandler(col) { // let baseH = thDom.getBoundingClientRect().height; let size = this.cellsize ? this.cellsize : this.attrBute.cellsize; let baseH = size == 'middle' ? 47 : size == 'small' ? 39 : 55; if (col.isEndNode) return baseH * col.nodeLevel; else if (col.leafNode && col.nodeLevel < this.maxLevel) {return baseH * this.maxLevel; } else return baseH; },

完結

以上就是ant desing vue table 實現可伸縮列的詳細內容,更多關于ant desing vue table 可伸縮列的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
红桃视频欧美| 亚洲精品系列| 欧美日韩精品一区二区三区视频 | 欧洲一区二区三区精品| 国产一区二区三区国产精品| 精品视频一区二区三区在线观看| 久久永久免费| 欧美aa一级| 黄色在线一区| 亚洲精品国产偷自在线观看| 国产一区二区三区四区| 高清一区二区三区| 日韩电影免费网站| 婷婷激情久久| 亚洲开心激情| 国产福利一区二区三区在线播放| 91免费精品| 国产精品毛片| 国产精品欧美大片| 久久精品欧美一区| 日韩美女国产精品| 国产在线不卡一区二区三区| 国产精品大片| 国产中文在线播放| 激情六月综合| 亚洲在线国产日韩欧美| 国产欧美88| 麻豆成人91精品二区三区| 97人人精品| 免费国产自久久久久三四区久久 | 黄色亚洲免费| 在线观看一区| 国产丝袜一区| 成人在线丰满少妇av| 99国产精品视频免费观看一公开| 91高清一区| 丝袜美腿亚洲色图| 日韩精品永久网址| 国产高清久久| 亚洲欧洲日韩精品在线| 国产伦精品一区二区三区视频 | 国产欧美日韩一级| 国产一区2区| 国产99久久| 亚洲人成亚洲精品| 四虎成人av| 午夜在线一区二区| 免费一区二区三区在线视频| 香蕉成人av| 亚洲欧美网站在线观看| 国产精品毛片视频| 91精品一区国产高清在线gif| 模特精品在线| 久久精品二区亚洲w码| 婷婷中文字幕一区| 国产精品一区二区av日韩在线| 成人羞羞视频播放网站| 日本在线观看不卡视频| 国产69精品久久| 亚洲精品99| 国产精品亚洲一区二区在线观看| av在线日韩| 青青草国产成人99久久| 亚洲在线免费| 国产精品免费不| 欧美99久久| 久久99免费视频| 国产精品日韩| 97精品在线| 欧美日本久久| 欧美日韩国产在线观看网站| 国产精品一区2区3区| 99国产精品| 美女福利一区二区三区| 免费人成精品欧美精品| 久久毛片亚洲| 国产乱码精品一区二区亚洲| 国产韩日影视精品| 精品色999| 日韩动漫一区| 黄色亚洲大片免费在线观看| 久久久久久色 | 国产毛片一区| 国产精品不卡| 日韩高清国产一区在线| 99久久精品费精品国产| 日韩久久一区| 久久99伊人| 日韩黄色大片网站| 精品在线网站观看| 天堂va在线高清一区| 亚洲黄色中文字幕| 国产福利一区二区精品秒拍 | 老司机精品视频网| 日精品一区二区三区| 视频一区中文| 欧美日韩精品免费观看视欧美高清免费大片| 国产情侣一区在线| 在线精品福利| 久久国产电影| 久久久久久夜| 欧美国产专区| 国产精品久一| 91亚洲精品视频在线观看| 日本大胆欧美人术艺术动态| 国户精品久久久久久久久久久不卡 | 国产精品最新| 日韩二区三区在线观看| 在线视频亚洲欧美中文| 亚洲激情社区| 黄色在线观看www| 久久字幕精品一区| 国产精品巨作av| 久久av免费看| 精品伊人久久| 精品日产乱码久久久久久仙踪林| 国产探花一区在线观看| 日韩精品国产欧美| 亚洲狼人精品一区二区三区| 国产精品美女久久久浪潮软件| 韩日一区二区三区| 亚洲午夜精品久久久久久app| 日韩免费福利视频| 成人久久一区| 欧美aa国产视频| 久久亚洲在线| 精品捆绑调教一区二区三区| 日韩在线综合| 亚洲福利专区| 午夜久久免费观看| 国产亚洲毛片在线| 美女精品在线观看| 亚洲一级淫片| 日韩成人午夜精品| 国产精品最新自拍| 国产一区二区三区成人欧美日韩在线观看| 美女视频黄久久| 国产精品毛片久久| 91tv亚洲精品香蕉国产一区| 亚洲播播91| 激情久久久久久久| 99国产精品99久久久久久粉嫩| 亚洲欧美久久| 日韩三级一区| 国产日产精品_国产精品毛片| 国产福利一区二区精品秒拍| 福利在线一区| 久久久久久久久99精品大| 欧美亚洲国产一区| 另类av一区二区| 久久国产人妖系列| av资源中文在线天堂| 136国产福利精品导航网址| 久久国产成人| 国产精品毛片久久久| 国产一区二区三区亚洲| 91看片一区| 老司机精品久久| 久久精品凹凸全集| 青青青免费在线视频| 欧美特黄一区| 91福利精品在线观看| 国产精品成人a在线观看| 伊人成人网在线看| 国产亚洲一区二区三区啪| 日韩在线看片| 亚洲三级毛片| 国内揄拍国内精品久久| 久久婷婷激情| 日韩一区精品| 韩国久久久久久| 欧美日韩视频一区二区三区| 欧美日韩xxxx| 欧美日韩精品免费观看视完整| 日韩在线观看一区二区| 你懂的亚洲视频| 欧美jjzz| 国产精品高潮呻吟久久久久| 亚洲国内精品| 欧美亚洲一区二区三区| 欧美天堂视频| 亚洲精品无播放器在线播放| 国产伦一区二区三区| 亚洲成人二区| 欧美一区激情| 亚洲国产专区校园欧美| 综合在线一区| 欧美sm一区| 日本99精品| 欧美日韩一二三四| 欧美日韩黄网站| 婷婷六月综合| 久久这里只有| 丝袜美腿亚洲一区二区图片| 国产一区二区三区亚洲| 日韩中文字幕av电影| 日本一区二区高清不卡| 久久aⅴ国产紧身牛仔裤| 国产a亚洲精品| 日本不卡不码高清免费观看 |