Commit 5d164b03ec365265f35d54b57d40954e70db7326

Authored by 梁灏
1 parent eeeceb54

fixed #3339

src/components/table/table-head.vue
... ... @@ -34,6 +34,7 @@
34 34 <span :class="[prefixCls + '-filter']">
35 35 <i class="ivu-icon ivu-icon-funnel" :class="{on: getColumn(rowIndex, index)._isFiltered}"></i>
36 36 </span>
  37 +
37 38 <div slot="content" :class="[prefixCls + '-filter-list']" v-if="getColumn(rowIndex, index)._filterMultiple">
38 39 <div :class="[prefixCls + '-filter-list-item']">
39 40 <checkbox-group v-model="getColumn(rowIndex, index)._filterChecked">
... ... @@ -133,8 +134,8 @@
133 134 },
134 135 scrollBarCellClass(){
135 136 let hasRightFixed = false;
136   - for(var i in this.headRows){
137   - for(var j in this.headRows[i]){
  137 + for(let i in this.headRows){
  138 + for(let j in this.headRows[i]){
138 139 if(this.headRows[i][j].fixed === 'right') {
139 140 hasRightFixed=true;
140 141 break;
... ... @@ -205,7 +206,13 @@
205 206 // 因为表头嵌套不是深拷贝,所以没有 _ 开头的方法,在 isGroup 下用此列
206 207 getColumn (rowIndex, index) {
207 208 const isGroup = this.columnRows.length > 1;
208   - return isGroup ? this.columns[rowIndex] : this.headRows[rowIndex][index];
  209 +
  210 + if (isGroup) {
  211 + const id = this.headRows[rowIndex][index].__id;
  212 + return this.columns.filter(item => item.__id === id)[0];
  213 + } else {
  214 + return this.headRows[rowIndex][index];
  215 + }
209 216 }
210 217 }
211 218 };
... ...
src/components/table/table.vue
... ... @@ -103,7 +103,7 @@
103 103 import ExportCsv from './export-csv';
104 104 import Locale from '../../mixins/locale';
105 105 import elementResizeDetectorMaker from 'element-resize-detector';
106   - import { getAllColumns, convertToRows, convertColumnOrder } from './util';
  106 + import { getAllColumns, convertToRows, convertColumnOrder, getRandomStr } from './util';
107 107  
108 108 const prefixCls = 'ivu-table';
109 109  
... ... @@ -178,6 +178,7 @@
178 178 }
179 179 },
180 180 data () {
  181 + const colsWithId = this.makeColumnsId(this.columns);
181 182 return {
182 183 ready: false,
183 184 tableWidth: 0,
... ... @@ -186,13 +187,13 @@
186 187 compiledUids: [],
187 188 objData: this.makeObjData(), // checkbox or highlight-row
188 189 rebuildData: [], // for sort or filter
189   - cloneColumns: this.makeColumns(),
  190 + cloneColumns: this.makeColumns(colsWithId),
190 191 minWidthColumns:[],
191 192 maxWidthColumns:[],
192   - columnRows: this.makeColumnRows(false),
193   - leftFixedColumnRows: this.makeColumnRows('left'),
194   - rightFixedColumnRows: this.makeColumnRows('right'),
195   - allColumns: getAllColumns(this.columns), // for multiple table-head, get columns that have no children
  193 + columnRows: this.makeColumnRows(false, colsWithId),
  194 + leftFixedColumnRows: this.makeColumnRows('left', colsWithId),
  195 + rightFixedColumnRows: this.makeColumnRows('right', colsWithId),
  196 + allColumns: getAllColumns(colsWithId), // for multiple table-head, get columns that have no children
196 197 showSlotHeader: true,
197 198 showSlotFooter: true,
198 199 bodyHeight: 0,
... ... @@ -828,9 +829,17 @@
828 829 });
829 830 return data;
830 831 },
831   - makeColumns () {
  832 + // 修改列,设置一个隐藏的 id,便于后面的多级表头寻找对应的列,否则找不到
  833 + makeColumnsId (columns) {
  834 + return columns.map(item => {
  835 + if ('children' in item) item.children = this.makeColumnsId(item.children);
  836 + item.__id = getRandomStr(6);
  837 + return item;
  838 + });
  839 + },
  840 + makeColumns (cols) {
832 841 // 在 data 时,this.allColumns 暂时为 undefined
833   - let columns = deepCopy(getAllColumns(this.columns));
  842 + let columns = deepCopy(getAllColumns(cols));
834 843 let left = [];
835 844 let right = [];
836 845 let center = [];
... ... @@ -869,8 +878,8 @@
869 878 return left.concat(center).concat(right);
870 879 },
871 880 // create a multiple table-head
872   - makeColumnRows (fixedType) {
873   - return convertToRows(this.columns, fixedType);
  881 + makeColumnRows (fixedType, cols) {
  882 + return convertToRows(cols, fixedType);
874 883 },
875 884 setMinMaxColumnRows (){
876 885 let minWidthColumns=[];
... ... @@ -964,13 +973,14 @@
964 973 columns: {
965 974 handler () {
966 975 // todo 这里有性能问题,可能是左右固定计算属性影响的
967   - this.allColumns = getAllColumns(this.columns);
  976 + const colsWithId = this.makeColumnsId(this.columns);
  977 + this.allColumns = getAllColumns(colsWithId);
968 978 this.cloneColumns = this.makeColumns();
969 979 this.setMinMaxColumnRows();
970 980  
971   - this.columnRows = this.makeColumnRows(false);
972   - this.leftFixedColumnRows = this.makeColumnRows('left');
973   - this.rightFixedColumnRows = this.makeColumnRows('right');
  981 + this.columnRows = this.makeColumnRows(false, colsWithId);
  982 + this.leftFixedColumnRows = this.makeColumnRows('left', colsWithId);
  983 + this.rightFixedColumnRows = this.makeColumnRows('right', colsWithId);
974 984 this.rebuildData = this.makeDataWithSortAndFilter();
975 985 this.handleResize();
976 986 },
... ...
src/components/table/util.js
... ... @@ -78,4 +78,16 @@ const convertToRows = (columns, fixedType = false) =&gt; {
78 78 return rows;
79 79 };
80 80  
81   -export {convertToRows};
82 81 \ No newline at end of file
  82 +export {convertToRows};
  83 +
  84 +const getRandomStr = function (len = 32) {
  85 + const $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
  86 + const maxPos = $chars.length;
  87 + let str = '';
  88 + for (let i = 0; i < len; i++) {
  89 + str += $chars.charAt(Math.floor(Math.random() * maxPos));
  90 + }
  91 + return str;
  92 +};
  93 +
  94 +export {getRandomStr};
83 95 \ No newline at end of file
... ...