Commit 35ad37642d24d1d555999fa5cd8e54fbbab5994a
1 parent
731d69a2
update Table
update Table
Showing
3 changed files
with
77 additions
and
54 deletions
Show diff stats
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 () { |