Commit 6dee0a655c72682adc2b6464592cb95213c83642
Merge remote-tracking branch 'upstream/master' into clean-css
Showing
7 changed files
with
228 additions
and
125 deletions
Show diff stats
src/components/table/cell.vue
1 | <template> | 1 | <template> |
2 | - <div :class="[prefixCls + '-cell']"> | 2 | + <div :class="classes"> |
3 | <template v-if="renderType === 'index'">{{index + 1}}</template> | 3 | <template v-if="renderType === 'index'">{{index + 1}}</template> |
4 | + <template v-if="renderType === 'selection'"> | ||
5 | + <Checkbox :checked="checked" @on-change="toggleSelect(index)"></Checkbox> | ||
6 | + </template> | ||
4 | <template v-if="renderType === 'normal'">{{{ row[column.key] }}}</template> | 7 | <template v-if="renderType === 'normal'">{{{ row[column.key] }}}</template> |
5 | </div> | 8 | </div> |
6 | </template> | 9 | </template> |
7 | <script> | 10 | <script> |
11 | + import Checkbox from '../checkbox/checkbox.vue'; | ||
12 | + | ||
8 | export default { | 13 | export default { |
14 | + components: { Checkbox }, | ||
9 | props: { | 15 | props: { |
10 | prefixCls: String, | 16 | prefixCls: String, |
11 | row: Object, | 17 | row: Object, |
12 | column: Object, | 18 | column: Object, |
13 | - index: Number | 19 | + index: Number, |
20 | + checked: Boolean, | ||
21 | + fixed: Boolean | ||
14 | }, | 22 | }, |
15 | data () { | 23 | data () { |
16 | return { | 24 | return { |
@@ -18,34 +26,51 @@ | @@ -18,34 +26,51 @@ | ||
18 | uid: -1 | 26 | uid: -1 |
19 | } | 27 | } |
20 | }, | 28 | }, |
29 | + computed: { | ||
30 | + classes () { | ||
31 | + return [ | ||
32 | + `${this.prefixCls}-cell`, | ||
33 | + { | ||
34 | + [`${this.prefixCls}-hidden`]: !this.fixed && this.column.fixed && (this.column.fixed === 'left' || this.column.fixed === 'right') | ||
35 | + } | ||
36 | + ] | ||
37 | + } | ||
38 | + }, | ||
21 | methods: { | 39 | methods: { |
22 | compile () { | 40 | compile () { |
23 | if (this.column.render) { | 41 | if (this.column.render) { |
42 | + const $parent = this.$parent.$parent.$parent; | ||
24 | const template = this.column.render(this.row, this.column, this.index); | 43 | const template = this.column.render(this.row, this.column, this.index); |
25 | const cell = document.createElement('div'); | 44 | const cell = document.createElement('div'); |
26 | cell.innerHTML = template; | 45 | cell.innerHTML = template; |
27 | - const _oldParentChildLen = this.$parent.$parent.$children.length; | ||
28 | - this.$parent.$parent.$compile(cell); | ||
29 | - const _newParentChildLen = this.$parent.$parent.$children.length; | 46 | + const _oldParentChildLen = $parent.$children.length; |
47 | + $parent.$compile(cell); | ||
48 | + const _newParentChildLen = $parent.$children.length; | ||
30 | 49 | ||
31 | if (_oldParentChildLen !== _newParentChildLen) { // if render normal html node, do not tag | 50 | if (_oldParentChildLen !== _newParentChildLen) { // if render normal html node, do not tag |
32 | - this.uid = this.$parent.$parent.$children[this.$parent.$parent.$children.length - 1]._uid; // tag it, and delete when data or columns update | 51 | + this.uid = $parent.$children[$parent.$children.length - 1]._uid; // tag it, and delete when data or columns update |
33 | } | 52 | } |
34 | this.$el.innerHTML = ''; | 53 | this.$el.innerHTML = ''; |
35 | this.$el.appendChild(cell); | 54 | this.$el.appendChild(cell); |
36 | } | 55 | } |
37 | }, | 56 | }, |
38 | destroy () { | 57 | destroy () { |
39 | - for (let i = 0; i < this.$parent.$parent.$children.length; i++) { | ||
40 | - if (this.$parent.$parent.$children[i]._uid === this.uid) { | ||
41 | - this.$parent.$parent.$children[i].$destroy(); | 58 | + const $parent = this.$parent.$parent.$parent; |
59 | + for (let i = 0; i < $parent.$children.length; i++) { | ||
60 | + if ($parent.$children[i]._uid === this.uid) { | ||
61 | + $parent.$children[i].$destroy(); | ||
42 | } | 62 | } |
43 | } | 63 | } |
64 | + }, | ||
65 | + toggleSelect (index) { | ||
66 | + this.$parent.$parent.toggleSelect(index); | ||
44 | } | 67 | } |
45 | }, | 68 | }, |
46 | compiled () { | 69 | compiled () { |
47 | if (this.column.type === 'index') { | 70 | if (this.column.type === 'index') { |
48 | this.renderType = 'index'; | 71 | this.renderType = 'index'; |
72 | + } else if (this.column.type === 'selection') { | ||
73 | + this.renderType = 'selection'; | ||
49 | } else if (this.column.render) { | 74 | } else if (this.column.render) { |
50 | this.renderType = 'render'; | 75 | this.renderType = 'render'; |
51 | } else { | 76 | } else { |
src/components/table/table-body.vue
1 | <template> | 1 | <template> |
2 | - | 2 | + <table cellspacing="0" cellpadding="0" border="0" :style="style"> |
3 | + <colgroup> | ||
4 | + <col v-for="column in columns" :width="setCellWidth(column, $index)"> | ||
5 | + </colgroup> | ||
6 | + <tbody :class="[prefixCls + '-tbody']"> | ||
7 | + <tr | ||
8 | + v-for="(index, row) in data" | ||
9 | + :class="[prefixCls + '-row', rowClsName(index), {[prefixCls + '-row-highlight']: cloneData[index] && cloneData[index]._isHighlight, [prefixCls + '-row-hover']: cloneData[index] && cloneData[index]._isHover}]" | ||
10 | + @mouseenter.stop="handleMouseIn(index)" | ||
11 | + @mouseleave.stop="handleMouseOut(index)" | ||
12 | + @click.stop="highlightCurrentRow(index)"> | ||
13 | + <td v-for="column in columns" :class="alignCls(column)"> | ||
14 | + <Cell | ||
15 | + :fixed="fixed" | ||
16 | + :prefix-cls="prefixCls" | ||
17 | + :row="row" | ||
18 | + :column="column" | ||
19 | + :index="index" | ||
20 | + :checked="cloneData[index] && cloneData[index]._isChecked"></Cell> | ||
21 | + </td> | ||
22 | + </tr> | ||
23 | + </tbody> | ||
24 | + </table> | ||
3 | </template> | 25 | </template> |
4 | <script> | 26 | <script> |
27 | + import Cell from './cell.vue'; | ||
28 | + import Mixin from './mixin'; | ||
29 | + | ||
5 | export default { | 30 | export default { |
31 | + mixins: [ Mixin ], | ||
32 | + components: { Cell }, | ||
6 | props: { | 33 | props: { |
7 | - | ||
8 | - }, | ||
9 | - data () { | ||
10 | - return { | ||
11 | - | ||
12 | - } | ||
13 | - }, | ||
14 | - computed: { | ||
15 | - | 34 | + prefixCls: String, |
35 | + style: Object, | ||
36 | + columns: Array, | ||
37 | + data: Array, | ||
38 | + cloneData: Array, | ||
39 | + fixed: Boolean | ||
16 | }, | 40 | }, |
17 | methods: { | 41 | methods: { |
18 | - | 42 | + setCellWidth (column, index) { |
43 | + return this.$parent.setCellWidth(column, index); | ||
44 | + }, | ||
45 | + rowClsName (index) { | ||
46 | + return this.$parent.rowClassName(this.data[index], index); | ||
47 | + }, | ||
48 | + handleMouseIn (index) { | ||
49 | + this.$parent.handleMouseIn(index); | ||
50 | + }, | ||
51 | + handleMouseOut (index) { | ||
52 | + this.$parent.handleMouseOut(index); | ||
53 | + }, | ||
54 | + highlightCurrentRow (index) { | ||
55 | + this.$parent.highlightCurrentRow(index); | ||
56 | + } | ||
19 | } | 57 | } |
20 | } | 58 | } |
21 | </script> | 59 | </script> |
22 | \ No newline at end of file | 60 | \ No newline at end of file |
src/components/table/table-column.vue deleted
src/components/table/table-head.vue
1 | <template> | 1 | <template> |
2 | - <thead> | ||
3 | - <tr> | ||
4 | - <th v-for="column in columns" :class="alignCls(column)"> | ||
5 | - <div :class="[prefixCls + '-cell']"> | ||
6 | - <template v-if="column.type === 'selection'"><Checkbox :checked="isSelectAll" @on-change="selectAll"></Checkbox></template> | ||
7 | - <template v-else>{{{ renderHeader(column, $index) }}}</template> | ||
8 | - </div> | ||
9 | - </th> | ||
10 | - </tr> | ||
11 | - </thead> | 2 | + <table cellspacing="0" cellpadding="0" border="0" :style="style"> |
3 | + <colgroup> | ||
4 | + <col v-for="column in columns" :width="setCellWidth(column, $index)"> | ||
5 | + </colgroup> | ||
6 | + <thead> | ||
7 | + <tr> | ||
8 | + <th v-for="column in columns" :class="alignCls(column)"> | ||
9 | + <div :class="[prefixCls + '-cell', {[prefixCls + '-hidden']: !fixed && column.fixed && (column.fixed === 'left' || column.fixed === 'right')}]"> | ||
10 | + <template v-if="column.type === 'selection'"><Checkbox :checked="isSelectAll" @on-change="selectAll"></Checkbox></template> | ||
11 | + <template v-else>{{{ renderHeader(column, $index) }}}</template> | ||
12 | + </div> | ||
13 | + </th> | ||
14 | + </tr> | ||
15 | + </thead> | ||
16 | + </table> | ||
12 | </template> | 17 | </template> |
13 | <script> | 18 | <script> |
14 | import Checkbox from '../checkbox/checkbox.vue'; | 19 | import Checkbox from '../checkbox/checkbox.vue'; |
@@ -20,13 +25,10 @@ | @@ -20,13 +25,10 @@ | ||
20 | components: { Checkbox }, | 25 | components: { Checkbox }, |
21 | props: { | 26 | props: { |
22 | prefixCls: String, | 27 | prefixCls: String, |
28 | + style: Object, | ||
23 | columns: Array, | 29 | columns: Array, |
24 | - cloneData: Array | ||
25 | - }, | ||
26 | - data () { | ||
27 | - return { | ||
28 | - | ||
29 | - } | 30 | + cloneData: Array, |
31 | + fixed: Boolean | ||
30 | }, | 32 | }, |
31 | computed: { | 33 | computed: { |
32 | isSelectAll () { | 34 | isSelectAll () { |
@@ -34,6 +36,9 @@ | @@ -34,6 +36,9 @@ | ||
34 | } | 36 | } |
35 | }, | 37 | }, |
36 | methods: { | 38 | methods: { |
39 | + setCellWidth (column, index) { | ||
40 | + return this.$parent.setCellWidth(column, index); | ||
41 | + }, | ||
37 | renderHeader (column, $index) { | 42 | renderHeader (column, $index) { |
38 | if ('renderHeader' in this.columns[$index]) { | 43 | if ('renderHeader' in this.columns[$index]) { |
39 | return this.columns[$index].renderHeader(column, $index); | 44 | return this.columns[$index].renderHeader(column, $index); |
@@ -43,16 +48,17 @@ | @@ -43,16 +48,17 @@ | ||
43 | }, | 48 | }, |
44 | selectAll () { | 49 | selectAll () { |
45 | const status = !this.isSelectAll; | 50 | const status = !this.isSelectAll; |
51 | + this.$parent.selectAll(status); | ||
46 | 52 | ||
47 | - let tmpData = deepCopy(this.cloneData); | ||
48 | - tmpData.forEach((data) => { | ||
49 | - data._isChecked = status; | ||
50 | - }); | ||
51 | - this.cloneData = tmpData; | ||
52 | - | ||
53 | - if (status) { | ||
54 | - this.$parent.selectAll(); | ||
55 | - } | 53 | +// let tmpData = deepCopy(this.cloneData); |
54 | +// tmpData.forEach((data) => { | ||
55 | +// data._isChecked = status; | ||
56 | +// }); | ||
57 | +// this.cloneData = tmpData; | ||
58 | +// | ||
59 | +// if (status) { | ||
60 | +// this.$parent.selectAll(); | ||
61 | +// } | ||
56 | } | 62 | } |
57 | } | 63 | } |
58 | } | 64 | } |
src/components/table/table.vue
@@ -2,68 +2,63 @@ | @@ -2,68 +2,63 @@ | ||
2 | <div :class="classes" :style="styles"> | 2 | <div :class="classes" :style="styles"> |
3 | <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> |
4 | <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"> |
5 | - <table cellspacing="0" cellpadding="0" border="0" :style="tableStyle"> | ||
6 | - <colgroup> | ||
7 | - <col v-for="column in cloneColumns" :width="setCellWidth(column, $index)"> | ||
8 | - </colgroup> | ||
9 | - <thead | ||
10 | - is="table-head" | ||
11 | - :prefix-cls="prefixCls" | ||
12 | - :clone-data.sync="cloneData" | ||
13 | - :columns="cloneColumns"></thead> | ||
14 | - </table> | 5 | + <table-head |
6 | + :prefix-cls="prefixCls" | ||
7 | + :style="tableStyle" | ||
8 | + :columns="cloneColumns" | ||
9 | + :clone-data="cloneData"></table-head> | ||
15 | </div> | 10 | </div> |
16 | - <div :class="[prefixCls + '-body']" :style="bodyStyle" @scroll="handleBodyScroll"> | ||
17 | - <table cellspacing="0" cellpadding="0" border="0" :style="tableStyle" v-el:tbody> | ||
18 | - <colgroup> | ||
19 | - <col v-for="column in cloneColumns" :width="setCellWidth(column, $index)"> | ||
20 | - </colgroup> | ||
21 | - <tbody :class="[prefixCls + '-tbody']" v-el:render> | ||
22 | - <tr | ||
23 | - v-for="(index, row) in data" | ||
24 | - :class="[prefixCls + '-row', rowClsName(index), {[prefixCls + '-row-highlight']: cloneData[index] && cloneData[index]._isHighlight, [prefixCls + '-row-hover']: cloneData[index] && cloneData[index]._isHover}]" | ||
25 | - @mouseenter.stop="handleMouseIn(index)" | ||
26 | - @mouseleave.stop="handleMouseOut(index)" | ||
27 | - @click.stop="highlightCurrentRow(index)"> | ||
28 | - <td v-for="column in cloneColumns" :class="alignCls(column)"> | ||
29 | - <div :class="[prefixCls + '-cell']" v-if="column.type === 'selection'"> | ||
30 | - <Checkbox :checked="cloneData[index] && cloneData[index]._isChecked" @on-change="toggleSelect(index)"></Checkbox> | ||
31 | - </div> | ||
32 | - <Cell v-else :prefix-cls="prefixCls" :row="row" :column="column" :index="index"></Cell> | ||
33 | - <!--<div :class="[prefixCls + '-cell']" v-else>--> | ||
34 | - <!--{{{ renderRow(row, column, index) }}}--> | ||
35 | - <!--</div>--> | ||
36 | - <!--<div :class="[prefixCls + '-cell']">--> | ||
37 | - <!--<template v-if="column.type === 'selection'">--> | ||
38 | - <!--<Checkbox :checked="cloneData[index] && cloneData[index]._isChecked" @on-change="toggleSelect(index)"></Checkbox>--> | ||
39 | - <!--</template>--> | ||
40 | - <!--<template v-else>{{{ renderRow(row, column, index) }}}</template>--> | ||
41 | - <!--</div>--> | ||
42 | - </td> | ||
43 | - </tr> | ||
44 | - </tbody> | ||
45 | - </table> | 11 | + <div :class="[prefixCls + '-body']" :style="bodyStyle" v-el:body @scroll="handleBodyScroll"> |
12 | + <table-body | ||
13 | + v-ref:tbody | ||
14 | + :prefix-cls="prefixCls" | ||
15 | + :style="tableStyle" | ||
16 | + :columns="cloneColumns" | ||
17 | + :data="data" | ||
18 | + :clone-data="cloneData"></table-body> | ||
46 | </div> | 19 | </div> |
47 | <div :class="[prefixCls + '-fixed']"> | 20 | <div :class="[prefixCls + '-fixed']"> |
48 | - | 21 | + <!--todo 设置个div头部--> |
22 | + <table-head | ||
23 | + fixed | ||
24 | + :prefix-cls="prefixCls" | ||
25 | + :style="fixedTableStyle" | ||
26 | + :columns="leftFixedColumns" | ||
27 | + :clone-data="cloneData"></table-head> | ||
28 | + <table-body | ||
29 | + fixed | ||
30 | + :prefix-cls="prefixCls" | ||
31 | + :style="fixedTableStyle" | ||
32 | + :columns="leftFixedColumns" | ||
33 | + :data="data" | ||
34 | + :clone-data="cloneData"></table-body> | ||
49 | </div> | 35 | </div> |
50 | <div :class="[prefixCls + '-fixed-right']"> | 36 | <div :class="[prefixCls + '-fixed-right']"> |
51 | - | 37 | + <table-head |
38 | + fixed | ||
39 | + :prefix-cls="prefixCls" | ||
40 | + :style="fixedRightTableStyle" | ||
41 | + :columns="rightFixedColumns" | ||
42 | + :clone-data="cloneData"></table-head> | ||
43 | + <table-body | ||
44 | + fixed | ||
45 | + :prefix-cls="prefixCls" | ||
46 | + :style="fixedRightTableStyle" | ||
47 | + :columns="rightFixedColumns" | ||
48 | + :data="data" | ||
49 | + :clone-data="cloneData"></table-body> | ||
52 | </div> | 50 | </div> |
53 | <div :class="[prefixCls + '-footer']" v-if="showSlotFooter" v-el:footer><slot name="footer"></slot></div> | 51 | <div :class="[prefixCls + '-footer']" v-if="showSlotFooter" v-el:footer><slot name="footer"></slot></div> |
54 | </div> | 52 | </div> |
55 | </template> | 53 | </template> |
56 | <script> | 54 | <script> |
57 | - import TableHead from './table-head.vue'; | ||
58 | - import Checkbox from '../checkbox/checkbox.vue'; | ||
59 | - import Cell from './cell.vue'; | ||
60 | - import Mixin from './mixin'; | 55 | + import tableHead from './table-head.vue'; |
56 | + import tableBody from './table-body.vue'; | ||
61 | import { oneOf, getStyle, deepCopy } from '../../utils/assist'; | 57 | import { oneOf, getStyle, deepCopy } from '../../utils/assist'; |
62 | const prefixCls = 'ivu-table'; | 58 | const prefixCls = 'ivu-table'; |
63 | 59 | ||
64 | export default { | 60 | export default { |
65 | - mixins: [ Mixin ], | ||
66 | - components: { TableHead, Checkbox, Cell }, | 61 | + components: { tableHead, tableBody }, |
67 | props: { | 62 | props: { |
68 | data: { | 63 | data: { |
69 | type: Array, | 64 | type: Array, |
@@ -82,6 +77,9 @@ | @@ -82,6 +77,9 @@ | ||
82 | return oneOf(value, ['small', 'large']); | 77 | return oneOf(value, ['small', 'large']); |
83 | } | 78 | } |
84 | }, | 79 | }, |
80 | + width: { | ||
81 | + type: [Number, String] | ||
82 | + }, | ||
85 | height: { | 83 | height: { |
86 | type: [Number, String] | 84 | type: [Number, String] |
87 | }, | 85 | }, |
@@ -141,6 +139,7 @@ | @@ -141,6 +139,7 @@ | ||
141 | styles () { | 139 | styles () { |
142 | let style = {}; | 140 | let style = {}; |
143 | if (!!this.height) style.height = `${this.height}px`; | 141 | if (!!this.height) style.height = `${this.height}px`; |
142 | + if (!!this.width) style.width = `${this.width}px`; | ||
144 | return style; | 143 | return style; |
145 | }, | 144 | }, |
146 | tableStyle () { | 145 | tableStyle () { |
@@ -148,6 +147,16 @@ | @@ -148,6 +147,16 @@ | ||
148 | if (this.tableWidth !== 0) style.width = `${this.tableWidth}px`; | 147 | if (this.tableWidth !== 0) style.width = `${this.tableWidth}px`; |
149 | return style; | 148 | return style; |
150 | }, | 149 | }, |
150 | + fixedTableStyle () { | ||
151 | + let style = {}; | ||
152 | + if (this.leftFixedColumns.length) style.width = this.leftFixedColumns.reduce((a, b) => a + b); | ||
153 | + return style; | ||
154 | + }, | ||
155 | + fixedRightTableStyle () { | ||
156 | + let style = {}; | ||
157 | + if (this.rightFixedColumns.length) style.width = this.rightFixedColumns.reduce((a, b) => a + b); | ||
158 | + return style; | ||
159 | + }, | ||
151 | bodyStyle () { | 160 | bodyStyle () { |
152 | let style = {}; | 161 | let style = {}; |
153 | if (this.bodyHeight !== 0) style.height = `${this.bodyHeight}px`; | 162 | if (this.bodyHeight !== 0) style.height = `${this.bodyHeight}px`; |
@@ -171,7 +180,7 @@ | @@ -171,7 +180,7 @@ | ||
171 | let autoWidthIndex = -1; | 180 | let autoWidthIndex = -1; |
172 | if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width); | 181 | if (allWidth) autoWidthIndex = this.cloneColumns.findIndex(cell => !cell.width); |
173 | 182 | ||
174 | - const $td = this.$els.tbody.querySelectorAll('tbody tr')[0].querySelectorAll('td'); | 183 | + const $td = this.$refs.tbody.$el.querySelectorAll('tbody tr')[0].querySelectorAll('td'); |
175 | for (let i = 0; i < $td.length; i++) { // can not use forEach in Firefox | 184 | for (let i = 0; i < $td.length; i++) { // can not use forEach in Firefox |
176 | if (i === autoWidthIndex) { | 185 | if (i === autoWidthIndex) { |
177 | this.columnsWidth.push(parseInt(getStyle($td[i], 'width')) - 1); | 186 | this.columnsWidth.push(parseInt(getStyle($td[i], 'width')) - 1); |
@@ -241,8 +250,16 @@ | @@ -241,8 +250,16 @@ | ||
241 | } | 250 | } |
242 | this.$emit('on-selection-change', selection); | 251 | this.$emit('on-selection-change', selection); |
243 | }, | 252 | }, |
244 | - selectAll () { | ||
245 | - this.$emit('on-select-all', this.getSelection()); | 253 | + selectAll (status) { |
254 | + let tmpData = deepCopy(this.cloneData); | ||
255 | + tmpData.forEach((data) => { | ||
256 | + data._isChecked = status; | ||
257 | + }); | ||
258 | + this.cloneData = tmpData; | ||
259 | + | ||
260 | + if (status) { | ||
261 | + this.$emit('on-select-all', this.getSelection()); | ||
262 | + } | ||
246 | }, | 263 | }, |
247 | fixedHeader () { | 264 | fixedHeader () { |
248 | if (!!this.height) { | 265 | if (!!this.height) { |
@@ -277,8 +294,15 @@ | @@ -277,8 +294,15 @@ | ||
277 | 294 | ||
278 | // todo 固定时上下滚动,固定的表头也滚动 scrollTop | 295 | // todo 固定时上下滚动,固定的表头也滚动 scrollTop |
279 | }, | 296 | }, |
280 | - handleMouseWheel () { | ||
281 | - console.log(111) | 297 | + handleMouseWheel (event) { |
298 | + const deltaX = event.deltaX; | ||
299 | + const $body = this.$els.body; | ||
300 | + | ||
301 | + if (deltaX > 0) { | ||
302 | + $body.scrollLeft = $body.scrollLeft + 10; | ||
303 | + } else { | ||
304 | + $body.scrollLeft = $body.scrollLeft - 10; | ||
305 | + } | ||
282 | } | 306 | } |
283 | }, | 307 | }, |
284 | compiled () { | 308 | compiled () { |
src/styles/components/table.less
@@ -10,7 +10,7 @@ | @@ -10,7 +10,7 @@ | ||
10 | border: 1px solid @border-color-base; | 10 | border: 1px solid @border-color-base; |
11 | border-bottom: 0; | 11 | border-bottom: 0; |
12 | border-right: 0; | 12 | border-right: 0; |
13 | - border-collapse: collapse; | 13 | + //border-collapse: collapse; |
14 | box-sizing: border-box; | 14 | box-sizing: border-box; |
15 | position: relative; | 15 | position: relative; |
16 | 16 | ||
@@ -130,6 +130,9 @@ | @@ -130,6 +130,9 @@ | ||
130 | word-break: break-all; | 130 | word-break: break-all; |
131 | box-sizing: border-box; | 131 | box-sizing: border-box; |
132 | } | 132 | } |
133 | + &-hidden{ | ||
134 | + visibility: hidden; | ||
135 | + } | ||
133 | th &-cell{ | 136 | th &-cell{ |
134 | display: inline-block; | 137 | display: inline-block; |
135 | position: relative; | 138 | position: relative; |
@@ -186,4 +189,29 @@ | @@ -186,4 +189,29 @@ | ||
186 | background-color: @table-td-highlight-bg; | 189 | background-color: @table-td-highlight-bg; |
187 | } | 190 | } |
188 | } | 191 | } |
192 | + | ||
193 | + &-fixed, &-fixed-right{ | ||
194 | + position: absolute; | ||
195 | + top: 0; | ||
196 | + left: 0; | ||
197 | + box-shadow: 1px 0 8px #d3d4d6; | ||
198 | + overflow-x: hidden; | ||
199 | + | ||
200 | + &::before { | ||
201 | + content: ''; | ||
202 | + width: 100%; | ||
203 | + height: 1px; | ||
204 | + background-color: @border-color-base; | ||
205 | + position: absolute; | ||
206 | + left: 0; | ||
207 | + bottom: 0; | ||
208 | + z-index: 4; | ||
209 | + } | ||
210 | + } | ||
211 | + &-fixed-right{ | ||
212 | + top: 0; | ||
213 | + left: auto; | ||
214 | + right: 0; | ||
215 | + box-shadow: -1px 0 8px #d3d4d6; | ||
216 | + } | ||
189 | } | 217 | } |
190 | \ No newline at end of file | 218 | \ No newline at end of file |
test/routers/table.vue
@@ -8,9 +8,8 @@ | @@ -8,9 +8,8 @@ | ||
8 | <!--<i-table size="large" border stripe :columns="columns" :data="data"></i-table>--> | 8 | <!--<i-table size="large" border stripe :columns="columns" :data="data"></i-table>--> |
9 | <br> | 9 | <br> |
10 | <i-table | 10 | <i-table |
11 | - style="width:450px" | 11 | + width="450" |
12 | border | 12 | border |
13 | - highlight-row | ||
14 | :columns="columns" | 13 | :columns="columns" |
15 | :data="data" | 14 | :data="data" |
16 | :row-class-name="rowClsName" | 15 | :row-class-name="rowClsName" |
@@ -38,6 +37,10 @@ | @@ -38,6 +37,10 @@ | ||
38 | width: 50 | 37 | width: 50 |
39 | }, | 38 | }, |
40 | { | 39 | { |
40 | + type: 'index', | ||
41 | + width: 50 | ||
42 | + }, | ||
43 | + { | ||
41 | title: '姓名', | 44 | title: '姓名', |
42 | key: 'name', | 45 | key: 'name', |
43 | align: 'left', | 46 | align: 'left', |
@@ -48,7 +51,7 @@ | @@ -48,7 +51,7 @@ | ||
48 | title: '年龄', | 51 | title: '年龄', |
49 | key: 'age', | 52 | key: 'age', |
50 | align: 'right', | 53 | align: 'right', |
51 | - fixed: 'left', | 54 | +// fixed: 'left', |
52 | width: 100 | 55 | width: 100 |
53 | // render (row) { | 56 | // render (row) { |
54 | // return `<i-button>${row.age}</i-button>` | 57 | // return `<i-button>${row.age}</i-button>` |
@@ -142,7 +145,7 @@ | @@ -142,7 +145,7 @@ | ||
142 | }, | 145 | }, |
143 | ready () { | 146 | ready () { |
144 | setTimeout(() => { | 147 | setTimeout(() => { |
145 | - return; | 148 | +// return; |
146 | // this.height = 150; | 149 | // this.height = 150; |
147 | // return | 150 | // return |
148 | // this.data.push({ | 151 | // this.data.push({ |
@@ -151,7 +154,7 @@ | @@ -151,7 +154,7 @@ | ||
151 | // address: '北京市东城区2', | 154 | // address: '北京市东城区2', |
152 | // edit: false | 155 | // edit: false |
153 | // }); | 156 | // }); |
154 | - this.data.splice(1, 1) | 157 | +// this.data.splice(1, 1) |
155 | }, 1000); | 158 | }, 1000); |
156 | } | 159 | } |
157 | } | 160 | } |