Commit 600fee60a54f57d0d026c2c3bd5cc0e17f43fcab
1 parent
004eaf47
Exists in
master
and in
1 other branch
优化新式表格渲染逻辑
Showing
4 changed files
with
40 additions
and
20 deletions
Show diff stats
examples/views/page/other.vue
| @@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
| 39 | 39 | ||
| 40 | <script> | 40 | <script> |
| 41 | import EgForm from './form-new'; | 41 | import EgForm from './form-new'; |
| 42 | -import EgTable from './table-new/editable'; | 42 | +import EgTable from './table-new'; |
| 43 | 43 | ||
| 44 | export default { | 44 | export default { |
| 45 | name: 'other', | 45 | name: 'other', |
| @@ -59,7 +59,11 @@ export default { | @@ -59,7 +59,11 @@ export default { | ||
| 59 | group: { title: '基础信息', span: 12 }, | 59 | group: { title: '基础信息', span: 12 }, |
| 60 | list: [ | 60 | list: [ |
| 61 | { type: 'el-input', label: '名称', key: 'name' }, | 61 | { type: 'el-input', label: '名称', key: 'name' }, |
| 62 | - { type: 'el-input-number', label: '年龄', key: 'age' }, | 62 | + { type: 'el-input-number', label: '年龄', key: 'age', |
| 63 | + render(h, { row, value }) { | ||
| 64 | + return h('el-tag', { props: { type: 'warning', size: 'mini' } }, [h('span', `${value}[${row.name}]`)]) | ||
| 65 | + } | ||
| 66 | + }, | ||
| 63 | ], | 67 | ], |
| 64 | }, | 68 | }, |
| 65 | { | 69 | { |
| @@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
| 1 | +import { get } from '../form-new/util'; | ||
| 2 | + | ||
| 3 | +export default { | ||
| 4 | + props: { row: Object, column: Object, index: [Number,String], item: Object }, | ||
| 5 | + render(h) { | ||
| 6 | + const { row, column, index, item } = this; | ||
| 7 | + if (typeof item.render === 'function') { | ||
| 8 | + return item.render(h, { row, value: get(row, item.fullKey), $index: index, column }); | ||
| 9 | + } else { | ||
| 10 | + if (item.render.children instanceof Function) { | ||
| 11 | + return h( | ||
| 12 | + item.render.type, | ||
| 13 | + { props: item.render.props, attrs: item.render.props, style: item.render.style }, | ||
| 14 | + item.render.children({ row, value: get(row, item.fullKey), $index: index, column }) | ||
| 15 | + ); | ||
| 16 | + } | ||
| 17 | + return h( | ||
| 18 | + item.render.type, | ||
| 19 | + { props: item.render.props, attrs: item.render.props, style: item.render.style }, | ||
| 20 | + item.render.children || get(row, item.fullKey) | ||
| 21 | + ); | ||
| 22 | + } | ||
| 23 | + } | ||
| 24 | +} | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |
examples/views/page/table-new/editable.vue
| @@ -37,10 +37,7 @@ | @@ -37,10 +37,7 @@ | ||
| 37 | :row="row" :value="$_get(row, item.fullKey)" :column="column" :index="$index" | 37 | :row="row" :value="$_get(row, item.fullKey)" :column="column" :index="$index" |
| 38 | ></slot> | 38 | ></slot> |
| 39 | <!-- 如果表格列配置了值渲染参数 --> | 39 | <!-- 如果表格列配置了值渲染参数 --> |
| 40 | - <component v-else-if="item.render" :is="item.render.type" v-bind="item.render.props" :style="item.render.style"> | ||
| 41 | - <template v-if="item.render.children">{{ bindItemRenderChildren(item, { row, column, $index }) }}</template> | ||
| 42 | - <template v-else>{{ $_get(row, item.fullKey) }}</template> | ||
| 43 | - </component> | 40 | + <cell-value-render v-else-if="item.render" :row="row" :column="column" :index="$index" :item="item" /> |
| 44 | </cell-editable> | 41 | </cell-editable> |
| 45 | </template> | 42 | </template> |
| 46 | </el-table-column> | 43 | </el-table-column> |
| @@ -58,6 +55,7 @@ | @@ -58,6 +55,7 @@ | ||
| 58 | <script> | 55 | <script> |
| 59 | import { cloneDeep, get, set } from '../form-new/util'; | 56 | import { cloneDeep, get, set } from '../form-new/util'; |
| 60 | import CellEditable from './cell-editable'; | 57 | import CellEditable from './cell-editable'; |
| 58 | +import CellValueRender from './cell-value-render'; | ||
| 61 | 59 | ||
| 62 | const listHasKey = (list, name) => { | 60 | const listHasKey = (list, name) => { |
| 63 | let result = false; | 61 | let result = false; |
| @@ -72,7 +70,10 @@ const listHasKey = (list, name) => { | @@ -72,7 +70,10 @@ const listHasKey = (list, name) => { | ||
| 72 | 70 | ||
| 73 | export default { | 71 | export default { |
| 74 | name: 'TableNew', | 72 | name: 'TableNew', |
| 75 | - components: { CellEditable }, | 73 | + components: { |
| 74 | + CellEditable, | ||
| 75 | + CellValueRender, | ||
| 76 | + }, | ||
| 76 | props: { | 77 | props: { |
| 77 | // 用于实例化本组件绑定v-model的值 | 78 | // 用于实例化本组件绑定v-model的值 |
| 78 | value: Array, | 79 | value: Array, |
| @@ -245,10 +246,6 @@ export default { | @@ -245,10 +246,6 @@ export default { | ||
| 245 | } | 246 | } |
| 246 | return result; | 247 | return result; |
| 247 | }, | 248 | }, |
| 248 | - // 处理表格项渲染时的子值 | ||
| 249 | - bindItemRenderChildren(item, scope) { | ||
| 250 | - return item.render.children instanceof Function ? item.render.children(scope) : this.$_get(scope.row, item.fullKey) | ||
| 251 | - }, | ||
| 252 | // 双击单元格 | 249 | // 双击单元格 |
| 253 | onCellDblclick(row, column, cell, event) { | 250 | onCellDblclick(row, column, cell, event) { |
| 254 | if (this.editable && !this.rowNew) { | 251 | if (this.editable && !this.rowNew) { |
examples/views/page/table-new/index.vue
| @@ -25,10 +25,7 @@ | @@ -25,10 +25,7 @@ | ||
| 25 | :row="row" :value="$_get(row, item.fullKey)" :column="column" :index="$index" | 25 | :row="row" :value="$_get(row, item.fullKey)" :column="column" :index="$index" |
| 26 | ></slot> | 26 | ></slot> |
| 27 | <!-- 如果表格列配置了值渲染参数 --> | 27 | <!-- 如果表格列配置了值渲染参数 --> |
| 28 | - <component v-else-if="item.render" :is="item.render.type" v-bind="item.render.props" :style="item.render.style"> | ||
| 29 | - <template v-if="item.render.children">{{ bindItemRenderChildren(item, { row, column, $index }) }}</template> | ||
| 30 | - <template v-else>{{ $_get(row, item.fullKey) }}</template> | ||
| 31 | - </component> | 28 | + <cell-value-render v-else-if="item.render" :row="row" :column="column" :index="$index" :item="item" /> |
| 32 | </cell-render> | 29 | </cell-render> |
| 33 | </template> | 30 | </template> |
| 34 | </el-table-column> | 31 | </el-table-column> |
| @@ -44,6 +41,7 @@ | @@ -44,6 +41,7 @@ | ||
| 44 | 41 | ||
| 45 | <script> | 42 | <script> |
| 46 | import { cloneDeep, get, set } from '../form-new/util'; | 43 | import { cloneDeep, get, set } from '../form-new/util'; |
| 44 | +import CellValueRender from './cell-value-render'; | ||
| 47 | 45 | ||
| 48 | export default { | 46 | export default { |
| 49 | name: 'TableNew', | 47 | name: 'TableNew', |
| @@ -57,7 +55,8 @@ export default { | @@ -57,7 +55,8 @@ export default { | ||
| 57 | return h('span', get(this.row, this.item.agentKey || this.item.fullKey)); | 55 | return h('span', get(this.row, this.item.agentKey || this.item.fullKey)); |
| 58 | } | 56 | } |
| 59 | }, | 57 | }, |
| 60 | - } | 58 | + }, |
| 59 | + CellValueRender | ||
| 61 | }, | 60 | }, |
| 62 | props: { | 61 | props: { |
| 63 | // 用于实例化本组件绑定v-model的值 | 62 | // 用于实例化本组件绑定v-model的值 |
| @@ -145,10 +144,6 @@ export default { | @@ -145,10 +144,6 @@ export default { | ||
| 145 | } | 144 | } |
| 146 | return result; | 145 | return result; |
| 147 | }, | 146 | }, |
| 148 | - // 处理表格项渲染时的子值 | ||
| 149 | - bindItemRenderChildren(item, scope) { | ||
| 150 | - return item.render.children instanceof Function ? item.render.children(scope) : this.$_get(scope.row, item.fullKey) | ||
| 151 | - }, | ||
| 152 | // 表格选中 | 147 | // 表格选中 |
| 153 | onSelectionChange(selection) { | 148 | onSelectionChange(selection) { |
| 154 | this.$emit('selection', selection); | 149 | this.$emit('selection', selection); |