Commit 35ad37642d24d1d555999fa5cd8e54fbbab5994a

Authored by 梁灏
1 parent 731d69a2

update Table

update Table
src/components/table/table-head.vue
@@ -11,8 +11,8 @@ @@ -11,8 +11,8 @@
11 <template v-else> 11 <template v-else>
12 {{{ renderHeader(column, $index) }}} 12 {{{ renderHeader(column, $index) }}}
13 <span :class="[prefixCls + '-sort']" v-if="column.sortable"> 13 <span :class="[prefixCls + '-sort']" v-if="column.sortable">
14 - <i class="ivu-icon ivu-icon-arrow-up-b" :class="{on: sortType === 'asc'}" @click="handleSortAsc($index)"></i>  
15 - <i class="ivu-icon ivu-icon-arrow-down-b" :class="{on: sortType === 'desc'}" @click="handleSortDesc($index)"></i> 14 + <i class="ivu-icon ivu-icon-arrow-up-b" :class="{on: column._sortType === 'asc'}" @click="handleSort($index, 'asc')"></i>
  15 + <i class="ivu-icon ivu-icon-arrow-down-b" :class="{on: column._sortType === 'desc'}" @click="handleSort($index, 'desc')"></i>
16 </span> 16 </span>
17 </template> 17 </template>
18 </div> 18 </div>
@@ -36,11 +36,6 @@ @@ -36,11 +36,6 @@
36 objData: Object, 36 objData: Object,
37 fixed: Boolean 37 fixed: Boolean
38 }, 38 },
39 - data () {  
40 - return {  
41 - sortType: 'normal'  
42 - }  
43 - },  
44 computed: { 39 computed: {
45 isSelectAll () { 40 isSelectAll () {
46 let isSelectAll = true; 41 let isSelectAll = true;
@@ -74,23 +69,11 @@ @@ -74,23 +69,11 @@
74 const status = !this.isSelectAll; 69 const status = !this.isSelectAll;
75 this.$parent.selectAll(status); 70 this.$parent.selectAll(status);
76 }, 71 },
77 - handleSortAsc (index) {  
78 - if (this.sortType === 'asc') {  
79 - this.sortType = 'normal';  
80 - this.$parent.handleSort(index, 'normal');  
81 - } else {  
82 - this.sortType = 'asc';  
83 - this.$parent.handleSort(index, 'asc');  
84 - }  
85 - },  
86 - handleSortDesc (index) {  
87 - if (this.sortType === 'desc') {  
88 - this.sortType = 'normal';  
89 - this.$parent.handleSort(index, 'normal');  
90 - } else {  
91 - this.sortType = 'desc';  
92 - this.$parent.handleSort(index, 'desc'); 72 + handleSort (index, type) {
  73 + if (this.columns[index]._sortType === type) {
  74 + type = 'normal';
93 } 75 }
  76 + this.$parent.handleSort(index, type);
94 } 77 }
95 } 78 }
96 } 79 }
src/components/table/table.vue
1 <template> 1 <template>
2 - {{objData|json}}  
3 <div :class="classes" :style="styles"> 2 <div :class="classes" :style="styles">
4 <div :class="[prefixCls + '-title']" v-if="showSlotHeader" v-el:title><slot name="header"></slot></div> 3 <div :class="[prefixCls + '-title']" v-if="showSlotHeader" v-el:title><slot name="header"></slot></div>
5 <div :class="[prefixCls + '-header']" v-if="showHeader" v-el:header @mousewheel="handleMouseWheel"> 4 <div :class="[prefixCls + '-header']" v-if="showHeader" v-el:header @mousewheel="handleMouseWheel">
@@ -120,12 +119,9 @@ @@ -120,12 +119,9 @@
120 columnsWidth: [], 119 columnsWidth: [],
121 prefixCls: prefixCls, 120 prefixCls: prefixCls,
122 compiledUids: [], 121 compiledUids: [],
123 - objData: this.makeObjData(), 122 + objData: this.makeObjData(), // checkbox or highlight-row
124 rebuildData: this.makeData(), // for sort or filter 123 rebuildData: this.makeData(), // for sort or filter
125 - cloneColumns: deepCopy(this.columns),  
126 - leftFixedColumns: [],  
127 - rightFixedColumns: [],  
128 - centerColumns: [], 124 + cloneColumns: this.makeColumns(),
129 showSlotHeader: true, 125 showSlotHeader: true,
130 showSlotFooter: true, 126 showSlotFooter: true,
131 bodyHeight: 0 127 bodyHeight: 0
@@ -175,6 +171,24 @@ @@ -175,6 +171,24 @@
175 let style = {}; 171 let style = {};
176 if (this.bodyHeight !== 0) style.height = `${this.bodyHeight - 1}px`; 172 if (this.bodyHeight !== 0) style.height = `${this.bodyHeight - 1}px`;
177 return style; 173 return style;
  174 + },
  175 + leftFixedColumns () {
  176 + let left = [];
  177 + this.cloneColumns.forEach((col) => {
  178 + if (col.fixed && col.fixed === 'left') {
  179 + left.push(col);
  180 + }
  181 + });
  182 + return left;
  183 + },
  184 + rightFixedColumns () {
  185 + let right = [];
  186 + this.cloneColumns.forEach((col) => {
  187 + if (col.fixed && col.fixed === 'right') {
  188 + right.push(col);
  189 + }
  190 + });
  191 + return right;
178 } 192 }
179 }, 193 },
180 methods: { 194 methods: {
@@ -277,24 +291,6 @@ @@ -277,24 +291,6 @@
277 }) 291 })
278 } 292 }
279 }, 293 },
280 - parseColumns () {  
281 - let left = [];  
282 - let right = [];  
283 - let center = [];  
284 - this.cloneColumns.forEach((col) => {  
285 - if (col.fixed && col.fixed === 'left') {  
286 - left.push(col);  
287 - } else if (col.fixed && col.fixed === 'right') {  
288 - right.push(col);  
289 - } else {  
290 - center.push(col);  
291 - }  
292 - });  
293 - this.leftFixedColumns = left;  
294 - this.rightFixedColumns = right;  
295 - this.centerColumns = center;  
296 - this.cloneColumns = left.concat(center).concat(right);  
297 - },  
298 handleBodyScroll (event) { 294 handleBodyScroll (event) {
299 if (this.showHeader) this.$els.header.scrollLeft = event.target.scrollLeft; 295 if (this.showHeader) this.$els.header.scrollLeft = event.target.scrollLeft;
300 if (this.leftFixedColumns.length) this.$els.fixedBody.scrollTop = event.target.scrollTop; 296 if (this.leftFixedColumns.length) this.$els.fixedBody.scrollTop = event.target.scrollTop;
@@ -311,15 +307,36 @@ @@ -311,15 +307,36 @@
311 } 307 }
312 }, 308 },
313 handleSort (index, type) { 309 handleSort (index, type) {
  310 + this.cloneColumns.forEach((col) => col._sortType = 'normal');
  311 +
  312 + const key = this.cloneColumns[index].key;
314 if (type === 'asc') { 313 if (type === 'asc') {
315 this.rebuildData.sort((a, b) => { 314 this.rebuildData.sort((a, b) => {
316 - return a.age > b.age;  
317 - }) 315 + if (this.cloneColumns[index].sortMethod) {
  316 + return this.cloneColumns[index].sortMethod(a, b);
  317 + } else {
  318 + return a[key] > b[key];
  319 + }
  320 + });
318 } else if (type === 'desc') { 321 } else if (type === 'desc') {
319 - 322 + this.rebuildData.sort((a, b) => {
  323 + if (this.cloneColumns[index].sortMethod) {
  324 + return this.cloneColumns[index].sortMethod(a, b);
  325 + } else {
  326 + return a[key] < b[key];
  327 + }
  328 + });
320 } else if (type === 'normal') { 329 } else if (type === 'normal') {
321 this.rebuildData = this.makeData(); 330 this.rebuildData = this.makeData();
322 } 331 }
  332 +
  333 + this.cloneColumns[index]._sortType = type;
  334 +
  335 + this.$emit('on-sort-change', {
  336 + column: JSON.parse(JSON.stringify(this.columns[this.cloneColumns[index]._index])),
  337 + key: key,
  338 + order: type
  339 + })
323 }, 340 },
324 makeData () { 341 makeData () {
325 let data = deepCopy(this.data); 342 let data = deepCopy(this.data);
@@ -336,10 +353,29 @@ @@ -336,10 +353,29 @@
336 data[index] = newRow; 353 data[index] = newRow;
337 }); 354 });
338 return data; 355 return data;
  356 + },
  357 + makeColumns () {
  358 + let columns = deepCopy(this.columns);
  359 + let left = [];
  360 + let right = [];
  361 + let center = [];
  362 +
  363 + columns.forEach((column, index) => {
  364 + column._sortType = 'normal';
  365 + column._index = index;
  366 +
  367 + if (column.fixed && column.fixed === 'left') {
  368 + left.push(column);
  369 + } else if (column.fixed && column.fixed === 'right') {
  370 + right.push(column);
  371 + } else {
  372 + center.push(column);
  373 + }
  374 + });
  375 + return left.concat(center).concat(right);
339 } 376 }
340 }, 377 },
341 compiled () { 378 compiled () {
342 - this.parseColumns();  
343 this.showSlotHeader = this.$els.title.innerHTML.replace(/\n/g, '').replace(/<!--[\w\W\r\n]*?-->/gmi, '') !== ''; 379 this.showSlotHeader = this.$els.title.innerHTML.replace(/\n/g, '').replace(/<!--[\w\W\r\n]*?-->/gmi, '') !== '';
344 this.showSlotFooter = this.$els.footer.innerHTML.replace(/\n/g, '').replace(/<!--[\w\W\r\n]*?-->/gmi, '') !== ''; 380 this.showSlotFooter = this.$els.footer.innerHTML.replace(/\n/g, '').replace(/<!--[\w\W\r\n]*?-->/gmi, '') !== '';
345 }, 381 },
@@ -362,8 +398,7 @@ @@ -362,8 +398,7 @@
362 }, 398 },
363 columns: { 399 columns: {
364 handler () { 400 handler () {
365 - this.cloneColumns = deepCopy(this.columns);  
366 - this.parseColumns(); 401 + this.cloneColumns = this.makeColumns();
367 this.handleResize(); 402 this.handleResize();
368 }, 403 },
369 deep: true 404 deep: true
test/routers/table.vue
@@ -19,7 +19,8 @@ @@ -19,7 +19,8 @@
19 @on-current-change="current" 19 @on-current-change="current"
20 @on-select="select" 20 @on-select="select"
21 @on-selection-change="schange" 21 @on-selection-change="schange"
22 - @on-select-all="sall"> 22 + @on-select-all="sall"
  23 + @on-sort-change="sortChange">
23 <!--<div slot="header">表格标题</div>--> 24 <!--<div slot="header">表格标题</div>-->
24 <!--<div slot="footer">表格标题</div>--> 25 <!--<div slot="footer">表格标题</div>-->
25 </i-table> 26 </i-table>
@@ -48,6 +49,7 @@ @@ -48,6 +49,7 @@
48 key: 'name', 49 key: 'name',
49 align: 'left', 50 align: 'left',
50 fixed: 'left', 51 fixed: 'left',
  52 + sortable: true,
51 width: 100 53 width: 100
52 }, 54 },
53 { 55 {
@@ -146,6 +148,9 @@ @@ -146,6 +148,9 @@
146 } else { 148 } else {
147 return ''; 149 return '';
148 } 150 }
  151 + },
  152 + sortChange (data) {
  153 + console.log(data)
149 } 154 }
150 }, 155 },
151 ready () { 156 ready () {