Commit 9f853e3ec898d605f2c16d3e456eaf41509cdee3

Authored by 梁灏
1 parent cb31ede0

update Table

update Table
Showing 2 changed files with 33 additions and 23 deletions   Show diff stats
src/components/table/table.vue
... ... @@ -321,39 +321,35 @@
321 321 $body.scrollLeft = $body.scrollLeft - 10;
322 322 }
323 323 },
  324 + sortData (data, type, index) {
  325 + const key = this.cloneColumns[index].key;
  326 + data.sort((a, b) => {
  327 + if (this.cloneColumns[index].sortMethod) {
  328 + return this.cloneColumns[index].sortMethod(a, b);
  329 + } else {
  330 + return type === 'asc' ? a[key] > b[key] : a[key] < b[key];
  331 + }
  332 + });
  333 + return data;
  334 + },
324 335 handleSort (index, type) {
325 336 this.cloneColumns.forEach((col) => col._sortType = 'normal');
326 337  
327 338 const key = this.cloneColumns[index].key;
328 339 if (this.cloneColumns[index].sortable !== 'custom') { // custom is for remote sort
329   - if (type === 'asc') {
330   - this.rebuildData.sort((a, b) => {
331   - if (this.cloneColumns[index].sortMethod) {
332   - return this.cloneColumns[index].sortMethod(a, b);
333   - } else {
334   - return a[key] > b[key];
335   - }
336   - });
337   - } else if (type === 'desc') {
338   - this.rebuildData.sort((a, b) => {
339   - if (this.cloneColumns[index].sortMethod) {
340   - return this.cloneColumns[index].sortMethod(a, b);
341   - } else {
342   - return a[key] < b[key];
343   - }
344   - });
345   - } else if (type === 'normal') {
  340 + if (type === 'normal') {
346 341 this.rebuildData = this.makeData();
  342 + } else {
  343 + this.rebuildData = this.sortData(this.rebuildData, type, index);
347 344 }
348 345 }
349   -
350 346 this.cloneColumns[index]._sortType = type;
351 347  
352 348 this.$emit('on-sort-change', {
353 349 column: JSON.parse(JSON.stringify(this.columns[this.cloneColumns[index]._index])),
354 350 key: key,
355 351 order: type
356   - })
  352 + });
357 353 },
358 354 handleFilterHide (index) { // clear checked that not filter now
359 355 if (!this.cloneColumns[index]._isFiltered) this.cloneColumns[index]._filterChecked = [];
... ... @@ -378,7 +374,7 @@
378 374 },
379 375 handleFilter (index) {
380 376 const column = this.cloneColumns[index];
381   - let filterData = this.makeData();
  377 + let filterData = this.makeDataWithSort();
382 378  
383 379 // filter others first, after filter this column
384 380 filterData = this.filterOtherData(filterData, index);
... ... @@ -396,7 +392,7 @@
396 392 this.cloneColumns[index]._filterVisible = false;
397 393 this.cloneColumns[index]._filterChecked = [];
398 394  
399   - let filterData = this.makeData();
  395 + let filterData = this.makeDataWithSort();
400 396 filterData = this.filterOtherData(filterData, index);
401 397 this.rebuildData = filterData;
402 398 },
... ... @@ -405,6 +401,20 @@
405 401 data.forEach((row, index) => row._index = index);
406 402 return data;
407 403 },
  404 + makeDataWithSort () {
  405 + let data = this.makeData();
  406 + let sortType = 'normal';
  407 + let sortIndex = -1;
  408 + for (let i = 0; i < this.cloneColumns.length; i++) {
  409 + if (this.cloneColumns[i]._sortType !== 'normal') {
  410 + sortType = this.cloneColumns[i]._sortType;
  411 + sortIndex = i;
  412 + break;
  413 + }
  414 + }
  415 + if (sortType !== 'normal') data = this.sortData(data, sortType, sortIndex);
  416 + return data;
  417 + },
408 418 makeObjData () {
409 419 let data = {};
410 420 this.data.forEach((row, index) => {
... ...
test/routers/table.vue
... ... @@ -99,7 +99,7 @@
99 99 key: 'age',
100 100 align: 'right',
101 101 // fixed: 'left',
102   - sortable: 'custom',
  102 + sortable: true,
103 103 width: 100,
104 104 filters: [
105 105 {
... ... @@ -235,7 +235,7 @@
235 235 // });
236 236 // this.data.splice(0, 1)
237 237 // this.columns.splice(2,1)
238   - }, 2000);
  238 + }, 3000);
239 239 }
240 240 }
241 241 </script>
242 242 \ No newline at end of file
... ...