Table support real Render function to render Cell

This commit is contained in:
梁灏 2017-05-04 12:05:29 +08:00
parent 687c4562f1
commit 87b6ef9d8b
2 changed files with 75 additions and 37 deletions

View file

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<Table border :context="self" :columns="columns7" :data="data6"></Table> <Table border :columns="columns7" :data="data6"></Table>
<abc></abc> <Button @click="handleAdd"> + 1</Button>
</div> </div>
</template> </template>
<script> <script>
@ -10,13 +10,23 @@
components: { abc }, components: { abc },
data () { data () {
return { return {
self: this, data1: 1,
// self: this,
columns7: [ columns7: [
{ {
title: '姓名', title: '姓名',
key: 'name', key: 'name',
render (row, column, index) { // render (row, column, index) {
return `<abc></abc>`; // return `<abc></abc>`;
// }
render: (h, row, column, index) => {
return h('div', [
h('Button',{
on: {
click: this.handleClick
}
}, 'hello')
])
} }
}, },
{ {
@ -61,6 +71,11 @@
] ]
} }
}, },
computed: {
ttt () {
return this.data1 + 1;
}
},
methods: { methods: {
show (index) { show (index) {
this.$Modal.info({ this.$Modal.info({
@ -70,6 +85,12 @@
}, },
remove (index) { remove (index) {
this.data6.splice(index, 1); this.data6.splice(index, 1);
},
handleAdd () {
this.data1++;
},
handleClick () {
this.$Message.info('111')
} }
} }
} }

View file

@ -48,6 +48,24 @@
methods: { methods: {
compile () { compile () {
if (this.column.render) { if (this.column.render) {
// Render
let isRealRender = false;
try {
this.column.render(this.row, this.column, this.index);
}
catch (err) {
isRealRender = true;
}
if (isRealRender) {
const component = new Vue({
render: (h) => {
return this.column.render(h, this.row, this.column, this.index);
}
});
const Cell = component.$mount();
this.$refs.cell.appendChild(Cell.$el);
} else {
const $parent = this.context; const $parent = this.context;
const template = this.column.render(this.row, this.column, this.index); const template = this.column.render(this.row, this.column, this.index);
const cell = document.createElement('div'); const cell = document.createElement('div');
@ -62,8 +80,6 @@
} }
}); });
const res = Vue.compile(cell.outerHTML); const res = Vue.compile(cell.outerHTML);
// todo
// 使 component // 使 component
const components = {}; const components = {};
Object.getOwnPropertyNames($parent.$options.components).forEach(item => { Object.getOwnPropertyNames($parent.$options.components).forEach(item => {
@ -85,6 +101,7 @@
const Cell = component.$mount(); const Cell = component.$mount();
this.$refs.cell.appendChild(Cell.$el); this.$refs.cell.appendChild(Cell.$el);
} }
}
}, },
destroy () { destroy () {