开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
动态组件 组件生成
当我们需要一个function,image的时候就需要用一个if分别去判断,新加一个就得重新去判断,有点繁琐,这下我们使用自动化工程,让组件自动帮我们生成 首先我们在vue的目录下,components下新建一个control的文件夹,将我们需要的一个个拆分到这里,比如下面这个图片,需要什么加就行了
这里我们新建的function的文件夹与我们自定义function是一样的
column: [
{
type: 'function',
label: "URL地址",
prop: "date"
},
],
利用node.js的require.context的去读取文件夹的内容,
传3个参数,第一个为文件夹的地址,第二个是一个开关(true和false),第三个就是指定文件的后缀,
const files = require.context('../control',true, /\index.vue$/)
console.log(files);
我们可以看到我们新建文件夹里面的文件都可以读取到,可以到到这是一个对象,我们使用 keys弄一个数组迭代对象,将对象中的./function/index.vue从对象中拿出来
const files = require.context('../control',true, /\index.vue$/)
console.log(files);
files.keys().forEach(item => {
console.log(item);
});
我们可以看到是字符串,通过split切割成数组
const key = item.split("/")
console.log(key);
这时候我们就可以获取到一开始定义的文件名了
const name = key[1]
我们的目的就是把组件格式化成这个样子
components: {
'com-function': () => import("../control/function"),
'com-image':() => import("../control/image")
},
const modules = {}
const files = require.context('../control',true, /\index.vue$/)
files.keys().forEach(item => {
const key = item.split("/")
const name = key[1]
//组合集成
modules[`com-${name}`] = files(item).default
});
console.log(modules);
这时候我们目的就达成了,最后我们就需要...modules就ok了,然后就可以新建多少都自动去读取了
components: {
...modules
},
附完整代码
<template>
<el-table
:data="tableData"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChange"
>
<el-table-column v-if="index" type="index" width="40px"></el-table-column>
<el-table-column v-if="checkbox" type="selection" width="40px"></el-table-column>
<template v-for="item in column">
<el-table-column :sort-by="item.sort_by" v-if="item.type === 'function'" :key="item.prop" :prop="item.prop" :label="item.label">
<template slot-scope="{row}">
<div v-html="item.callback && item.callback(row)"></div>
</template>
</el-table-column>
<el-table-column v-if="item.type === 'slot'" :key="item.prop" :prop="item.prop" :label="item.label">
<template slot-scope="{row}">
<slot :name="item.slot_name" :data="row"></slot>
</template>
</el-table-column>
<el-table-column :sort-by="item.sort_by" :sortable="item.sort" v-else :key="item.prop" :prop="item.prop" :label="item.label"></el-table-column>
</template>
</el-table>
</template>
<script>
const modules = {}
const files = require.context('../control',true, /\index.vue$/)
files.keys().forEach(item => {
const key = item.split("/")
const name = key[1]
//组合集成
modules[`com-${name}`] = files(item).default
});
export default {
name: "Table",
props: {
checkList: {
type:Array,
default: () => []
},
column: {
type: Array,
default: () => []
},
checkbox: {
type: Boolean,
default: true
},
initRequest: {
type: Boolean,
default: true
},
url:{
type: String,
default: "",
require: true
},
method: {
type: String,
default: "post",
require: true
},
data: {
type: Object,
default: () => {}
},
params: {
type: Object,
default: () => {}
},
format: Function,
index: Boolean,
onLoad: Boolean,//默认是fasle
},
data() {
return {
tableData: [
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀区金沙江路 1518 弄",
id: 20
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀区金沙江路 1517 弄",
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀区金沙江路 1519 弄",
},
{
date: "2016-05-03",
name: "王小虎",
address: "上海市普陀区金沙江路 1516 弄",
},
],
};
},
components: {
...modules
},
beforeMount() {
this.initRequest && this.getTableList()
},
methods: {
getTableList() {
const url = this.url
if(!url) {
console.log("请求地址不存在");
return false
}
const request_data = {
url: this.url,
method: this.method
}
if(JSON.stringify(this.data) != '{}') {
request_data.data = this.data
}
if(JSON.stringify(this.params) != '{}') {
request_data.params = this.params
}
this.$axios({request_data}).then((Response => {
let request_data = Response.data
if(this.format && typeof this.format=== 'function') {
request_data = this.format(Response.data)
}
this.tableData = request_data
//回调数据
this.onLoad && this.$emit("onload",Response.data)
}))
},
handlerRequest() {
this.getTableList()
},
handleSelectionChange(val) {
this.$emit("update:checkList",val)
},
sortChange({column, prop, order}) {
const sort_by = column.sortBy
console.log(sort_by,order);
}
}
};
</script>