Commit 224a3ae5395994bc6e720f51b9e175c7cfcea9fa
1 parent
5e7a3b29
publish 0.9.9-rc-3
fixed Table width bug when resize window
Showing
6 changed files
with
44 additions
and
23 deletions
Show diff stats
package.json
1 | { | 1 | { |
2 | "name": "iview", | 2 | "name": "iview", |
3 | - "version": "0.9.9-rc-2", | 3 | + "version": "0.9.9-rc-3", |
4 | "title": "iView", | 4 | "title": "iView", |
5 | "description": "A high quality UI components Library with Vue.js", | 5 | "description": "A high quality UI components Library with Vue.js", |
6 | "homepage": "http://www.iviewui.com", | 6 | "homepage": "http://www.iviewui.com", |
src/components/table/mixin.js
@@ -11,8 +11,16 @@ export default { | @@ -11,8 +11,16 @@ export default { | ||
11 | isPopperShow (column) { | 11 | isPopperShow (column) { |
12 | return column.filters && ((!this.fixed && !column.fixed) || (this.fixed === 'left' && column.fixed === 'left') || (this.fixed === 'right' && column.fixed === 'right')); | 12 | return column.filters && ((!this.fixed && !column.fixed) || (this.fixed === 'left' && column.fixed === 'left') || (this.fixed === 'right' && column.fixed === 'right')); |
13 | }, | 13 | }, |
14 | - setCellWidth (index) { | ||
15 | - return this.column[index].width ? this.column.width : this.columnsWidth[index]; | 14 | + setCellWidth (column, index) { |
15 | + // return column.width ? column.width : this.columnsWidth[index]; | ||
16 | + let width = ''; | ||
17 | + if (column.width) { | ||
18 | + width = column.width; | ||
19 | + } else if (this.columnsWidth[column._index]) { | ||
20 | + width = this.columnsWidth[column._index].width | ||
21 | + } | ||
22 | + // return this.columnsWidth[column._index] ? this.columnsWidth[column._index].width : ''; | ||
23 | + return width; | ||
16 | } | 24 | } |
17 | } | 25 | } |
18 | } | 26 | } |
19 | \ No newline at end of file | 27 | \ No newline at end of file |
src/components/table/table-body.vue
1 | <template> | 1 | <template> |
2 | <table cellspacing="0" cellpadding="0" border="0" :style="style"> | 2 | <table cellspacing="0" cellpadding="0" border="0" :style="style"> |
3 | <colgroup> | 3 | <colgroup> |
4 | - <col v-for="item in setCellWidth" :width="setCellWidth($index)"> | 4 | + <col v-for="column in columns" :width="setCellWidth(column, $index)"> |
5 | </colgroup> | 5 | </colgroup> |
6 | <tbody :class="[prefixCls + '-tbody']"> | 6 | <tbody :class="[prefixCls + '-tbody']"> |
7 | <tr | 7 | <tr |
@@ -37,7 +37,7 @@ | @@ -37,7 +37,7 @@ | ||
37 | columns: Array, | 37 | columns: Array, |
38 | data: Array, // rebuildData | 38 | data: Array, // rebuildData |
39 | objData: Object, | 39 | objData: Object, |
40 | - columnsWidth: Array, | 40 | + columnsWidth: Object, |
41 | fixed: { | 41 | fixed: { |
42 | type: [Boolean, String], | 42 | type: [Boolean, String], |
43 | default: false | 43 | default: false |
src/components/table/table-head.vue
1 | <template> | 1 | <template> |
2 | <table cellspacing="0" cellpadding="0" border="0" :style="style"> | 2 | <table cellspacing="0" cellpadding="0" border="0" :style="style"> |
3 | <colgroup> | 3 | <colgroup> |
4 | - <col v-for="item in setCellWidth" :width="setCellWidth($index)"> | 4 | + <col v-for="column in columns" :width="setCellWidth(column, $index)"> |
5 | </colgroup> | 5 | </colgroup> |
6 | <thead> | 6 | <thead> |
7 | <tr> | 7 | <tr> |
@@ -69,7 +69,7 @@ | @@ -69,7 +69,7 @@ | ||
69 | columns: Array, | 69 | columns: Array, |
70 | objData: Object, | 70 | objData: Object, |
71 | data: Array, // rebuildData | 71 | data: Array, // rebuildData |
72 | - columnsWidth: Array, | 72 | + columnsWidth: Object, |
73 | fixed: { | 73 | fixed: { |
74 | type: [Boolean, String], | 74 | type: [Boolean, String], |
75 | default: false | 75 | default: false |
src/components/table/table.vue
@@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
8 | :style="tableStyle" | 8 | :style="tableStyle" |
9 | :columns="cloneColumns" | 9 | :columns="cloneColumns" |
10 | :obj-data="objData" | 10 | :obj-data="objData" |
11 | - :columns-width.sync="columnsWidth" | 11 | + :columns-width="columnsWidth" |
12 | :data="rebuildData"></table-head> | 12 | :data="rebuildData"></table-head> |
13 | </div> | 13 | </div> |
14 | <div :class="[prefixCls + '-body']" :style="bodyStyle" v-el:body @scroll="handleBodyScroll"> | 14 | <div :class="[prefixCls + '-body']" :style="bodyStyle" v-el:body @scroll="handleBodyScroll"> |
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | :style="tableStyle" | 18 | :style="tableStyle" |
19 | :columns="cloneColumns" | 19 | :columns="cloneColumns" |
20 | :data="rebuildData" | 20 | :data="rebuildData" |
21 | - :columns-width.sync="columnsWidth" | 21 | + :columns-width="columnsWidth" |
22 | :obj-data="objData"></table-body> | 22 | :obj-data="objData"></table-body> |
23 | </div> | 23 | </div> |
24 | <div :class="[prefixCls + '-fixed']" :style="fixedTableStyle"> | 24 | <div :class="[prefixCls + '-fixed']" :style="fixedTableStyle"> |
@@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
39 | :style="fixedTableStyle" | 39 | :style="fixedTableStyle" |
40 | :columns="leftFixedColumns" | 40 | :columns="leftFixedColumns" |
41 | :data="rebuildData" | 41 | :data="rebuildData" |
42 | - :columns-width.sync="columnsWidth" | 42 | + :columns-width="columnsWidth" |
43 | :obj-data="objData"></table-body> | 43 | :obj-data="objData"></table-body> |
44 | </div> | 44 | </div> |
45 | </div> | 45 | </div> |
@@ -61,7 +61,7 @@ | @@ -61,7 +61,7 @@ | ||
61 | :style="fixedRightTableStyle" | 61 | :style="fixedRightTableStyle" |
62 | :columns="rightFixedColumns" | 62 | :columns="rightFixedColumns" |
63 | :data="rebuildData" | 63 | :data="rebuildData" |
64 | - :columns-width.sync="columnsWidth" | 64 | + :columns-width="columnsWidth" |
65 | :obj-data="objData"></table-body> | 65 | :obj-data="objData"></table-body> |
66 | </div> | 66 | </div> |
67 | </div> | 67 | </div> |
@@ -128,7 +128,7 @@ | @@ -128,7 +128,7 @@ | ||
128 | return { | 128 | return { |
129 | ready: false, | 129 | ready: false, |
130 | tableWidth: 0, | 130 | tableWidth: 0, |
131 | - columnsWidth: [], | 131 | + columnsWidth: {}, |
132 | prefixCls: prefixCls, | 132 | prefixCls: prefixCls, |
133 | compiledUids: [], | 133 | compiledUids: [], |
134 | objData: this.makeObjData(), // checkbox or highlight-row | 134 | objData: this.makeObjData(), // checkbox or highlight-row |
@@ -176,7 +176,7 @@ | @@ -176,7 +176,7 @@ | ||
176 | let style = {}; | 176 | let style = {}; |
177 | let width = 0; | 177 | let width = 0; |
178 | this.leftFixedColumns.forEach((col) => { | 178 | this.leftFixedColumns.forEach((col) => { |
179 | - if (col.fixed && col.fixed === 'left') width += col.width; | 179 | + if (col.fixed && col.fixed === 'left') width += col._width; |
180 | }); | 180 | }); |
181 | style.width = `${width}px`; | 181 | style.width = `${width}px`; |
182 | return style; | 182 | return style; |
@@ -185,7 +185,7 @@ | @@ -185,7 +185,7 @@ | ||
185 | let style = {}; | 185 | let style = {}; |
186 | let width = 0; | 186 | let width = 0; |
187 | this.rightFixedColumns.forEach((col) => { | 187 | this.rightFixedColumns.forEach((col) => { |
188 | - if (col.fixed && col.fixed === 'right') width += col.width; | 188 | + if (col.fixed && col.fixed === 'right') width += col._width; |
189 | }); | 189 | }); |
190 | style.width = `${width}px`; | 190 | style.width = `${width}px`; |
191 | return style; | 191 | return style; |
@@ -231,25 +231,35 @@ | @@ -231,25 +231,35 @@ | ||
231 | }, | 231 | }, |
232 | handleResize () { | 232 | handleResize () { |
233 | this.$nextTick(() => { | 233 | this.$nextTick(() => { |
234 | - const allWidth = !this.columns.some(cell => !cell.width); | 234 | + const allWidth = !this.columns.some(cell => !cell.width); // each column set a width |
235 | if (allWidth) { | 235 | if (allWidth) { |
236 | this.tableWidth = this.columns.map(cell => cell.width).reduce((a, b) => a + b); | 236 | this.tableWidth = this.columns.map(cell => cell.width).reduce((a, b) => a + b); |
237 | } else { | 237 | } else { |
238 | this.tableWidth = parseInt(getStyle(this.$el, 'width')) - 1; | 238 | this.tableWidth = parseInt(getStyle(this.$el, 'width')) - 1; |
239 | } | 239 | } |
240 | + this.columnsWidth = {}; | ||
240 | this.$nextTick(() => { | 241 | this.$nextTick(() => { |
241 | - this.columnsWidth = []; | 242 | + let columnsWidth = {}; |
242 | let autoWidthIndex = -1; | 243 | let autoWidthIndex = -1; |
243 | - if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width); | 244 | + if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width);//todo 这行可能有问题 |
244 | 245 | ||
245 | const $td = this.$refs.tbody.$el.querySelectorAll('tbody tr')[0].querySelectorAll('td'); | 246 | const $td = this.$refs.tbody.$el.querySelectorAll('tbody tr')[0].querySelectorAll('td'); |
246 | for (let i = 0; i < $td.length; i++) { // can not use forEach in Firefox | 247 | for (let i = 0; i < $td.length; i++) { // can not use forEach in Firefox |
248 | + const column = this.cloneColumns[i]; | ||
249 | + | ||
250 | + let width = parseInt(getStyle($td[i], 'width')); | ||
247 | if (i === autoWidthIndex) { | 251 | if (i === autoWidthIndex) { |
248 | - this.columnsWidth.push(parseInt(getStyle($td[i], 'width')) - 1); | ||
249 | - } else { | ||
250 | - this.columnsWidth.push(parseInt(getStyle($td[i], 'width'))); | 252 | + width = parseInt(getStyle($td[i], 'width')) - 1; |
253 | + } | ||
254 | + if (column.width) width = column.width; | ||
255 | + | ||
256 | + this.cloneColumns[i]._width = width; | ||
257 | + | ||
258 | + columnsWidth[column._index] = { | ||
259 | + width: width | ||
251 | } | 260 | } |
252 | } | 261 | } |
262 | + this.columnsWidth = columnsWidth; | ||
253 | }); | 263 | }); |
254 | }); | 264 | }); |
255 | }, | 265 | }, |
@@ -464,6 +474,7 @@ | @@ -464,6 +474,7 @@ | ||
464 | 474 | ||
465 | columns.forEach((column, index) => { | 475 | columns.forEach((column, index) => { |
466 | column._index = index; | 476 | column._index = index; |
477 | + column._width = column.width ? column.width : ''; // update in handleResize() | ||
467 | column._sortType = 'normal'; | 478 | column._sortType = 'normal'; |
468 | column._filterVisible = false; | 479 | column._filterVisible = false; |
469 | column._isFiltered = false; | 480 | column._isFiltered = false; |
test/routers/table.vue
1 | <template> | 1 | <template> |
2 | - <i-table :columns="columns1" :data="data1"></i-table> | 2 | + <i-table border :columns="columns1" :data="data1"></i-table> |
3 | </template> | 3 | </template> |
4 | <script> | 4 | <script> |
5 | export default { | 5 | export default { |
@@ -12,7 +12,9 @@ | @@ -12,7 +12,9 @@ | ||
12 | }, | 12 | }, |
13 | { | 13 | { |
14 | title: '年龄', | 14 | title: '年龄', |
15 | - key: 'age' | 15 | + key: 'age', |
16 | + fixed: 'left', | ||
17 | +// width: 200 | ||
16 | }, | 18 | }, |
17 | { | 19 | { |
18 | title: '地址', | 20 | title: '地址', |
@@ -44,4 +46,4 @@ | @@ -44,4 +46,4 @@ | ||
44 | } | 46 | } |
45 | } | 47 | } |
46 | } | 48 | } |
47 | -</script> | 49 | -</script> |
50 | +</script> | ||
48 | \ No newline at end of file | 51 | \ No newline at end of file |