看到这标题,老实说一开始第一个想法是难道用: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>