Commit 77201524baf3a26262824783c8586074af81a48a
1 parent
75803add
column add prop minValue and maxValue
Showing
2 changed files
with
139 additions
and
53 deletions
Show diff stats
examples/routers/table.vue
1 | 1 | <template> |
2 | 2 | <div> |
3 | - <br><br><br><br><br> | |
3 | + <!-- <br><br><br><br><br> | |
4 | 4 | <Table border :columns="columns1" height="500" :data="data1"></Table> |
5 | - <br><br><br><br><br> | |
5 | + <br><br><br><br><br> --> | |
6 | 6 | <!--<Table width="550" height="200" border :columns="columns2" :data="data4"></Table>--> |
7 | 7 | <!--<br><br><br><br><br>--> |
8 | - <Table border :columns="columns5" height="240" :data="data5"></Table> | |
8 | + <!-- <Table border :columns="columns5" height="240" :data="data5"></Table> --> | |
9 | 9 | <br><br><br><br><br> |
10 | - <Table border :columns="columns6" :data="data5"></Table> | |
10 | + <!-- <Table border :columns="columns6" :data="data5"></Table> --> | |
11 | 11 | <br><br><br><br><br> |
12 | - <Table border :columns="columns7" height="240" :data="data7"></Table> | |
12 | + <!-- <Table border :columns="columns7" height="240" :data="data7"></Table> | |
13 | + <br><br><br><br><br> --> | |
14 | + <Table border :columns="columns8" :data="data7" height="200"></Table> | |
13 | 15 | <br><br><br><br><br> |
14 | 16 | </div> |
15 | 17 | </template> |
... | ... | @@ -117,7 +119,7 @@ |
117 | 119 | key: 'gender', |
118 | 120 | align: 'center', |
119 | 121 | width: 200, |
120 | - //fixed: 'right' | |
122 | + fixed: 'right' | |
121 | 123 | } |
122 | 124 | ], |
123 | 125 | columns2: [ |
... | ... | @@ -393,6 +395,34 @@ |
393 | 395 | date: '2016-10-04' |
394 | 396 | } |
395 | 397 | ], |
398 | + | |
399 | + columns8: [ | |
400 | + { | |
401 | + title: 'Date', | |
402 | + key: 'date', | |
403 | + sortable: true, | |
404 | + minWidth:100, | |
405 | + maxWidth:200, | |
406 | + }, | |
407 | + { | |
408 | + title: 'Name', | |
409 | + key: 'name', | |
410 | + minWidth:100, | |
411 | + maxWidth:200, | |
412 | + }, | |
413 | + { | |
414 | + title: 'Age', | |
415 | + key: 'age', | |
416 | + minWidth:100, | |
417 | + maxWidth:200, | |
418 | + }, | |
419 | + { | |
420 | + title: 'Address', | |
421 | + key: 'address', | |
422 | + minWidth:200, | |
423 | + maxWidth:300, | |
424 | + } | |
425 | + ], | |
396 | 426 | } |
397 | 427 | }, |
398 | 428 | mounted () { | ... | ... |
src/components/table/table.vue
... | ... | @@ -375,60 +375,116 @@ |
375 | 375 | }); |
376 | 376 | this.$nextTick(() => { |
377 | 377 | let columnsWidth = {}; |
378 | - let autoWidthIndex = -1; | |
379 | - if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width);//todo 这行可能有问题 | |
380 | - | |
381 | - if (this.data.length) { | |
382 | - const $tr = this.$refs.tbody.$el.querySelectorAll('tbody tr'); | |
383 | - if ($tr.length === 0) return; | |
384 | - const $td = $tr[0].children; | |
385 | - for (let i = 0; i < $td.length; i++) { // can not use forEach in Firefox | |
386 | - const column = this.cloneColumns[i]; | |
387 | - | |
388 | - let width = parseInt(getStyle($td[i], 'width')); | |
389 | - if (i === autoWidthIndex) { | |
390 | - width = parseInt(getStyle($td[i], 'width')) - 1; | |
378 | + | |
379 | + let hasWidthColumns = []; | |
380 | + let noWidthColumns = []; | |
381 | + let minWidthColumns = []; | |
382 | + let maxWidthColumns = []; | |
383 | + this.cloneColumns.forEach((col) => { | |
384 | + if (col.width) { | |
385 | + hasWidthColumns.push(col); | |
386 | + } | |
387 | + else{ | |
388 | + noWidthColumns.push(col); | |
389 | + if(col.minWidth){ | |
390 | + minWidthColumns.push(col); | |
391 | 391 | } |
392 | - if (column.width) width = column.width; | |
392 | + if(col.maxWidth){ | |
393 | + maxWidthColumns.push(col); | |
394 | + } | |
395 | + } | |
396 | + }); | |
393 | 397 | |
394 | - this.cloneColumns[i]._width = width; | |
398 | + minWidthColumns.sort((a,b)=>a.minWidth > b.minWidth); | |
399 | + maxWidthColumns.sort((a,b)=>a.maxWidth < b.maxWidth); | |
395 | 400 | |
396 | - columnsWidth[column._index] = { | |
397 | - width: width | |
398 | - }; | |
401 | + let unUsableWidth = hasWidthColumns.map(cell => cell.width).reduce((a, b) => a + b, 0); | |
402 | + let usableWidth = this.tableWidth - unUsableWidth - (this.showVerticalScrollBar?this.scrollBarWidth:0); | |
403 | + let usableLength = noWidthColumns.length; | |
404 | + let columnWidth = parseInt(usableWidth / usableLength); | |
405 | + | |
406 | + for (let i = 0; i < maxWidthColumns.length; i++) { | |
407 | + if(columnWidth > maxWidthColumns[i].maxWidth){ | |
408 | + usableWidth -= maxWidthColumns[i].maxWidth; | |
409 | + usableLength--; | |
410 | + columnWidth = parseInt(usableWidth / usableLength); | |
399 | 411 | } |
400 | - this.columnsWidth = columnsWidth; | |
401 | - this.$nextTick(()=>{ | |
402 | - this.fixedHeader(); | |
403 | - if (this.$refs.tbody) { | |
404 | - let bodyContentEl = this.$refs.tbody.$el; | |
405 | - let bodyEl = bodyContentEl.parentElement; | |
406 | - let bodyContentHeight = bodyContentEl.offsetHeight; | |
407 | - let bodyContentWidth = bodyContentEl.offsetWidth; | |
408 | - let bodyWidth = bodyEl.offsetWidth; | |
409 | - let bodyHeight = bodyEl.offsetHeight; | |
410 | - let scrollBarWidth = 0; | |
411 | - if (bodyWidth < bodyContentWidth + (bodyHeight<bodyContentHeight?this.scrollBarWidth : 0)) { | |
412 | - scrollBarWidth = this.scrollBarWidth; | |
413 | - } | |
414 | - | |
415 | - this.showVerticalScrollBar = this.bodyHeight? bodyHeight - scrollBarWidth < bodyContentHeight : false; | |
416 | - this.showHorizontalScrollBar = bodyWidth < bodyContentWidth + (this.showVerticalScrollBar?this.scrollBarWidth:0); | |
417 | - | |
418 | - if(this.showVerticalScrollBar){ | |
419 | - bodyEl.classList.add(this.prefixCls +'-overflowY'); | |
420 | - }else{ | |
421 | - bodyEl.classList.remove(this.prefixCls +'-overflowY'); | |
422 | - } | |
423 | - if(this.showHorizontalScrollBar){ | |
424 | - bodyEl.classList.add(this.prefixCls +'-overflowX'); | |
425 | - }else{ | |
426 | - bodyEl.classList.remove(this.prefixCls +'-overflowX'); | |
427 | - } | |
412 | + } | |
413 | + | |
414 | + for (let i = 0; i < minWidthColumns.length; i++) { | |
415 | + if(columnWidth < minWidthColumns[i].minWidth){ | |
416 | + usableWidth -= minWidthColumns[i].minWidth; | |
417 | + usableLength--; | |
418 | + columnWidth = parseInt(usableWidth / usableLength); | |
419 | + } | |
420 | + } | |
428 | 421 | |
422 | + if (usableLength===0){ | |
423 | + columnWidth = 0; | |
424 | + } | |
425 | + | |
426 | + for (let i = 0; i < this.cloneColumns.length; i++) { | |
427 | + const column = this.cloneColumns[i]; | |
428 | + let width = columnWidth; | |
429 | + if(column.width){ | |
430 | + width = column.width; | |
431 | + } | |
432 | + else{ | |
433 | + if (column.minWidth > width){ | |
434 | + width = column.minWidth; | |
435 | + } | |
436 | + else if (column.maxWidth < width){ | |
437 | + width = column.maxWidth; | |
438 | + } | |
439 | + else{ | |
440 | + if (usableLength > 1) { | |
441 | + usableLength--; | |
442 | + usableWidth -= width; | |
443 | + columnWidth = parseInt(usableWidth / usableLength); | |
444 | + } | |
429 | 445 | } |
430 | - }); | |
446 | + } | |
447 | + | |
448 | + | |
449 | + this.cloneColumns[i]._width = width; | |
450 | + | |
451 | + columnsWidth[column._index] = { | |
452 | + width: width | |
453 | + }; | |
454 | + | |
431 | 455 | } |
456 | + this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0); | |
457 | + this.columnsWidth = columnsWidth; | |
458 | + this.$nextTick(()=>{ | |
459 | + this.fixedHeader(); | |
460 | + if (this.$refs.tbody) { | |
461 | + let bodyContentEl = this.$refs.tbody.$el; | |
462 | + let bodyEl = bodyContentEl.parentElement; | |
463 | + let bodyContentHeight = bodyContentEl.offsetHeight; | |
464 | + let bodyContentWidth = bodyContentEl.offsetWidth; | |
465 | + let bodyWidth = bodyEl.offsetWidth; | |
466 | + let bodyHeight = bodyEl.offsetHeight; | |
467 | + let scrollBarWidth = 0; | |
468 | + if (bodyWidth < bodyContentWidth + (bodyHeight<bodyContentHeight?this.scrollBarWidth : 0)) { | |
469 | + scrollBarWidth = this.scrollBarWidth; | |
470 | + } | |
471 | + | |
472 | + this.showVerticalScrollBar = this.bodyHeight? bodyHeight - scrollBarWidth < bodyContentHeight : false; | |
473 | + this.showHorizontalScrollBar = bodyWidth < bodyContentWidth + (this.showVerticalScrollBar?this.scrollBarWidth:0); | |
474 | + | |
475 | + if(this.showVerticalScrollBar){ | |
476 | + bodyEl.classList.add(this.prefixCls +'-overflowY'); | |
477 | + }else{ | |
478 | + bodyEl.classList.remove(this.prefixCls +'-overflowY'); | |
479 | + } | |
480 | + if(this.showHorizontalScrollBar){ | |
481 | + bodyEl.classList.add(this.prefixCls +'-overflowX'); | |
482 | + }else{ | |
483 | + bodyEl.classList.remove(this.prefixCls +'-overflowX'); | |
484 | + } | |
485 | + this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0) + (this.showVerticalScrollBar?this.scrollBarWidth:0); | |
486 | + } | |
487 | + }); | |
432 | 488 | }); |
433 | 489 | // get table real height,for fixed when set height prop,but height < table's height,show scrollBarWidth |
434 | 490 | this.bodyRealHeight = parseInt(getStyle(this.$refs.tbody.$el, 'height')); | ... | ... |