日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iview table 自定义列_案例 | iview中Table:拖拽适配列、自定义固定列、合并行

發布時間:2024/10/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iview table 自定义列_案例 | iview中Table:拖拽适配列、自定义固定列、合并行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文 / 景朝霞

來源公號 / 朝霞的光影筆記

ID / zhaoxiajingjing

????點個贊,讓我知道你來過~????

0 / 更新Table

"iview": "2.13.0",對比最新版本的iview:4.1.3中的Table功能,獲取最新功能:拖拽、合并行等。

【PS:由于一些原因不能統一升級整個iview,我動了源碼這很不好,望大佬們不吝賜教更好的方案~】

1 / Table的拖拽適配列

在table.vue文件中handleResize方法里實現了:

不設置列的屬性width,而是設置屬性maxWidth和minWidth用來適配在拖拽時表格產生的留白的適配,會把留白的寬度平均分配給適配列。

其中,最后呈現的寬度不會比最小寬還小,不會比最大寬度還大。

(1)拖拽設置邊界值

為了使拖拽后的表格不會無限制的寬,也不會特別窄,設置邊界值:

table.vue

minColumnWidth:{

type:Number,

default:50

},

maxColumnWidth:{

type:Number,

default:560

}

table-head.vue

const columnWidth = _width < this.minColumnWidth ? this.minColumnWidth : (_width > this.maxColumnWidth ? this.maxColumnWidth : _width);

(2)可拖拽范圍加寬

把鼠標可拖拽的范圍放寬:

if (rect.width > 12 && rect.right - event.pageX < 8)

// 把判斷條件的8改為16

table.less

.@{table-prefix-cls} {

&-header{

&-resizable{

width: 20px; // 把原來的10px更新為20px

}

}

}

2 / Table的自定義固定列

公號ID:zhaoxiajiingjing

△圖12.1:用戶可以自己配置固定列

公號:朝霞的光影筆記

△圖12.2:固定后的結果

【PS:實現此功能,請原諒我修改了源碼】

在列上添加屬性freezable:true表示允許用戶自己設置固定列,其代碼里面操作的依舊是列的屬性fixed實現效果。

(1)新增泡泡文件freeze-poptip.vue

v-model="showFlag"

popper-class="ivu-table-popper "

trigger="hover"

placement="top" :transfer="true">

import Poptip from '../poptip/poptip.vue';

export default {

components: { Poptip },

props:{

prefixCls: String,

show:{

type:Boolean

},

hide:{

type:Boolean

}

},

watch:{

hide(newFlag, oldFlag){

if(newFlag === false) {

this.showFlag = false;

}

}

},

data() {

return {

showFlag:this.show

};

}

}

(2)在表頭添加凍結提示泡泡table-head.vue

import FreezePoptip from './freeze-poptip.vue';

:show="getColumn(rowIndex, index)._freezeVisible"

:prefixCls="prefixCls"

:hide="getColumn(rowIndex, index)._freezeVisiblePoptip"

>

@click="handleFreezable(getColumn(rowIndex, index)._index, 'left')">

:disabled="column.fixed === 'left'" >左側凍結

@click="handleFreezable(getColumn(rowIndex, index)._index, 'right')">

:disabled="column.fixed === 'right'">右側凍結

@click="handleFreezable(getColumn(rowIndex, index)._index, '')">

:disabled="(typeof column.fixed === 'string' && column.fixed.length === 0) || typeof column.fixed === 'undefined'" >還原

添加點擊方法

// 2020年3月10日10:08:28 凍結

handleFreezable(index, type){

const column = this.columns.find(item => item._index === index);

const _index = column._index;

this.$parent.handleFreezable(_index, type);

},

(3)修改table.vue

handleFreezable(_index, type){

const index = this.GetOriginalIndex(_index);

const key = this.cloneColumns[index].key;

this.cloneColumns[index]._freezeVisiblePoptip = false;

this.$emit('on-freeze-change', {

column:JSON.parse(JSON.stringify(this.allColumns[this.cloneColumns[index]._index])),

key,

fixed:type

});

},

makeColumns (cols) {

//....CODE

let hasFreezable = columns.some(col => col.freezable===true);

let hasResizable = columns.some(col => col.resizable===true);

columns.forEach((column, index) => {

//...CODE

(hasFreezable || hasResizable ) && (column.width = parseInt(column.width));

//...CODE

});

//....CODE

}

(4)應用

應用的代碼在文末

3 / Table的合并行

(1)閱讀iview的源碼

根據iview給出的例子,只需要把合并的規則傳入到組件內即可

公號ID:zhaoxiajingjing

△圖12.3:iview的Table合并行的例子

table-body.vue在這里可以學習一下,如何判斷一個方法的返回值是數組還是對象

getSpan (row, column, rowIndex, columnIndex) {

// 拿到傳過來的方法 spanMethod

const fn = this.$parent.spanMethod;

// 是function類型的才可以

if (typeof fn === 'function') {

// 調用該方法,并把返回值結果賦值給變量result

const result = fn({

row,

column,

rowIndex,

columnIndex

});

// 設置初始值

let rowspan = 1;

let colspan = 1;

if (Array.isArray(result)) {

// 返回結果值是數組

rowspan = result[0];

colspan = result[1];

} else if (typeof result === 'object') {

// 返回結果值是對象

rowspan = result.rowspan;

colspan = result.colspan;

}

return {

rowspan,

colspan

};

} else { // 否則:{}

return {};

}

},

(1)判斷是否為函數typeof fn === 'function'

(2)判斷是否為數組Array.isArray(result)

(3)判斷是否為對象typeof result === 'object'【僅限于此處約定的返回值是一個對象或者一個數組】

let fn = function (){

return [];

};

if (typeof fn === 'function'){ // (1)

const result = fn();

if (Array.isArray(result)) { // (2)

// ...something

} else if (typeof result === 'object') { //(3)

// ...something

}

}

可以看到它的表格數據data5是一條一條寫的。

對于我們想要的數據格式如下,那就需要處理一下了,具體方法見文末

[

{

"teacher":"教師1",

"course":"語文",

"studentList":[

{

"student":"學生1"

},

{

"student":"學生2"

}

]

}

]

(2)鼠標移入的樣式

公號:朝霞的光影筆記

△圖12.4:鼠標移入的樣式

思路:在設置合并行的時候,給一個統一的標識符,在鼠標移入后,把帶有該標識符的都加上移入的樣式

【PS:大佬們打臉輕一些,請不吝賜教更好的方案】

公號:朝霞的光影筆記

△圖12.5:給tr加上行標識

rowClasses (_index) {

// ...CODE

let {rowspanHoverFlag} = objData;

if(rowspanHoverFlag && objData){

for (let rowIndex in this.objData) {

let row = this.objData[rowIndex];

if(row.rowspanHoverFlag === rowspanHoverFlag && this.$parent.$el) {

let el = this.$parent.$el.querySelector(`.myhoverindex-${rowIndex}`);

let _class = objData._isHover ?

( `myhoverindex-${rowIndex} ${this.prefixCls}-row ${this.rowClsName(rowIndex)} ${this.prefixCls}-row-highlight ${this.prefixCls}-row-hover`)

: (`myhoverindex-${rowIndex} ${this.prefixCls}-row ${this.rowClsName(rowIndex)}`);

(el!==null && el.setAttribute) && el.setAttribute('class',_class);

}

}

}

// ...CODE

}

4 / 應用

PS:自定義凍結是修改的源碼,如需要該功能,請自行貼上面介紹的代碼

PS:我動了源碼這很不好,望大佬不吝賜教更好的方案

公號ID:zhaoxiajingjing

border

ref="selection"

:columns="columns3"

:data="data3"

:span-method="handleSpan"

@on-freeze-change="onFreezeChange"

>

export default {

data() {

return {

columns3:[

{

title:'教師',

key:'teacher',

resizable:true,

freezable:true,

width:100

},

{

title:'教師編號',

key:'teacherCode',

resizable:true,

freezable:true,

width:120

},

{

title:'課程',

key:'course',

resizable:true,

freezable:true,

width:120

},

{

title:'學生',

key:'student',

rowRelation:'many',

resizable:true,

freezable:true,

width:100

},

{

title:'學號',

key:'studentCode',

rowRelation:'many',

resizable:true,

width:120

},

{

title:'成績',

key:'score',

rowRelation:'many',

resizable:true,

freezable:true,

width:100

},

{

title:'批語',

key:'explain',

rowRelation:'many',

freezable:true,

minWidth:100

}

],

data3:[],

tableDataArr3:[

{

"id":1,

"teacher":"Name 1",

"teacherCode":"Teacher-1",

"course":"語文",

"studentList":[

{

"studentCode":"2020001",

"student":"學生1",

"score":"A",

"explain":""

},

{

"studentCode":"2020002",

"student":"學生2",

"score":"B",

"explain":""

},

{

"studentCode":"2020003",

"student":"學生3",

"score":"B",

"explain":""

},

{

"studentCode":"2020004",

"student":"學生4",

"score":"A",

"explain":""

}

]

},

{

"id":2,

"teacher":"Name 2",

"teacherCode":"Teacher-2",

"course":"物理",

"studentList":[

{

"studentCode":"2020001",

"student":"學生1",

"score":"B",

"explain":""

},

{

"studentCode":"2020002",

"student":"學生2",

"score":"B",

"explain":""

},

{

"studentCode":"2020003",

"student":"學生3",

"score":"B",

"explain":""

}

]

},

{

"id":3,

"teacher":"Name 3",

"teacherCode":"Teacher-3",

"course":"歷史",

"studentList":[

{

"studentCode":"2020003",

"student":"學生3",

"score":"A",

"explain":""

},

{

"studentCode":"2020004",

"student":"學生4",

"score":"A",

"explain":""

}

]

},

{

"id":4,

"teacher":"Name 4",

"teacherCode":"Teacher-4",

"course":"美術",

"studentList":[

{

"studentCode":"2020004",

"student":"學生4",

"score":"A",

"explain":""

}

]

}

],

};

},

mounted() {

setTimeout(() => {

this.data3 = this.data2TdRowspan({tableData:this.tableDataArr3, rowspanList:'studentList'});

}, 300);

},

methods: {

onFreezeChange({column = {}, key = '', fixed = ''} = {}) {

this.columns3 = this.columns3.map((col, index) =>{

if (col.key === key) {

col['fixed'] = fixed;

}

return col;

});

},

/**

* 2020年4月2日09:53:02 by jing_zhaoxia@sina.com

* @param arr 需要處理的數據數組

* @param rowspanList 合并行的數組

* @param rowspanHoverFlag 作為鼠標滑入的行的標記

* @returns {*} [Array] 將處理好的數據返回去

*/

data2TdRowspan(params){

let json = {};

if (Array.isArray(params)) {

json.tableData = params;

} else if(Object.prototype.toString.call(params) === '[object Object]'){

json = params;

}

let {tableData:arr = [], rowspanList = 'studentList', rowspanHoverFlag='id'} = json;

return arr.map((row, index) =>{

let rowspanArr = row[rowspanList];

let rowspan = rowspanArr.length;

return rowspanArr.map((sRow, sIndex) => {

sIndex === 0 ? row.rowspan = rowspan : (row.rowspan = 0, row._rowspan = rowspan);

sRow.rowspanHoverFlag = row[rowspanHoverFlag];

delete row[rowspanList];

return { ...sRow, ...row};

});

}).flat(Infinity);

},

handleSpan({row:{rowspan}, column:{rowRelation='', isExtended=false}}) {

return rowRelation !== 'many' ? {rowspan} : {};

}

}

};

總結

以上是生活随笔為你收集整理的iview table 自定义列_案例 | iview中Table:拖拽适配列、自定义固定列、合并行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 午夜写真片福利电影网 | 天天躁夜夜躁狠狠躁 | 亚洲av无码乱码国产麻豆 | 亚欧精品视频一区二区三区 | 欧美熟妇精品一区二区蜜桃视频 | 亚洲色图偷拍视频 | 国产视频久久久 | 999精品一区| 成人福利影院 | 亚洲资源在线观看 | 国产高潮国产高潮久久久91 | av福利在线观看 | 日本在线天堂 | 亚洲欧洲一二三区 | 2021毛片| aaa级黄色片 | 国产91视频在线 | 五月婷婷啪啪 | 日韩成人在线看 | 成人久久久精品国产乱码一区二区 | 国产第一色| 久久久天堂国产精品女人 | 香蕉视频在线免费看 | 91中文字幕永久在线 | 国产精品国产三级国产三级人妇 | 99香蕉网 | 男人的天堂av网 | 午夜久久久久久久久久久 | 黄色性情网站 | 免费看欧美成人a片无码 | 精品色图| 欧美性生活精品 | 国产精品分类 | 国产精品分类 | 精品国产99一区二区乱码综合 | 男人天堂2021| 国产成人精品国内自产拍免费看 | 久久久久久亚洲av无码专区 | 日本最黄网站 | 热热热色 | 五月精品 | 欧美va视频 | 欧美 日韩 国产 一区 | 97射射| 激情四射av | 超碰人人干人人 | 日本xxx在线播放 | 国产视频在线一区 | 亚欧美日韩 | 成人午夜精品无码区 | 视色影视 | 成人在线91 | 乌克兰做爰xxxⅹ性视频 | 国产精品一区二区三区免费视频 | 久久久精品人妻无码专区 | 欧美又大粗又爽又黄大片视频 | 国产精品网站在线 | 日本免费网站视频 | 成人精品在线看 | 性开放的欧美大片 | 色婷婷激情 | 图片区视频区小说区 | 日韩av日韩 | 用力抵着尿进去了h | 久热免费视频 | 男操女免费网站 | 国产精品久久 | 日本加勒比中文字幕 | 一区视频在线免费观看 | 日本精品在线一区 | 国产乱码精品一区二区三区中文 | 禁漫天堂在线 | 亚洲一区二区三区播放 | 欧美日本高清 | 成人高潮视频 | 中文字幕在线视频一区 | 男朋友是消防员第一季 | 泽村玲子av| 国产精品无码电影在线观看 | 中日韩免费视频 | 两性免费视频 | 欧美不卡二区 | 免费av看 | 天天摸天天操天天爽 | 国产第一色 | 国产人妻777人伦精品hd | 天堂草在线观看 | 中文字幕在线三区 | 久久精品视频网站 | 进去里片欧美 | 一本色道久久亚洲综合精品蜜桃 | 色97色| 三级伦理视频 | 伊人久久久久噜噜噜亚洲熟女综合 | 69视频免费观看 | 日韩精品久久久久久久 | 老司机深夜福利在线观看 | 一曲二曲三曲在线观看中文字幕动漫 |