看到这标题,老实说一开始第一个想法是难道用:Vue.compile?render?发现门槛有点高,因为第三方组件是在 HTML 块上已经编译好了的,所以如何用 JS 再动态添加再编译呢?
于是,想到 Vue 的更新原理:只要触发它的数据就可以重新编译组件成 HTML 代码,那么只要把数据传到数组里(用 for 循环和 if 判断组件类型即可)扔过去不就完事了,唯一的缺点就是,每次都要从头到尾重新编译下。代码如下:
<template>
<div class="WorkContent">
<el-table
:data="list"
align="center"
header-align="center">
<el-table-column type="index"></el-table-column>
<el-table-column label="内容">
<template slot-scope="scope">
<el-input
v-if="scope.row.type === 0"
type="textarea"
:rows="2"
:disabled="true"
v-model="scope.row.content"></el-input>
<audio v-else-if="scope.row.type === 1" :src="scope.row.content" controls></audio>
<img v-else-if="scope.row.type === 2" :src="scope.row.content" alt="图片">
<video v-else-if="scope.row.type === 3" :src="scope.row.content" controls></video>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<i class="el-icon-close" @click="deleteItem(scope.$index)"></i>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
name: 'WorkContent',
data () {
return {
list: []
}
},
methods: {
deleteItem (index) {
this.list.splice(index, 1)
}
}
}
</script>
<style lang="stylus" scoped>
</style>