使用jsx匹配的方式进行组件形成组件。
<template>
<el-form>
<formItem></formItem>
<el-form>
</template>
<script>
import FormItem from "./formItem.vue"
export default {
components:{
FormItem
}
data(){
return{
name:{
type:'input',
label:'名字'
value:''
},
isShowName:{
type:'checkbox',
label:'显示名字',
value: false
},
profession:{
type:'profession',
label:'职业'
value:'teacher'
}
}
}
}
</script>
// formItem
<script>
const items = {
checkbox(key) {
return (
<el-form-item>
<el-checkbox
value={this.form[key].value}
onChange={(val) => {
this.form[key].value = val;
}}
>
{this.form[key].label}
</el-checkbox>
</el-form-item>
);
},
input(key) {
return (
<el-form-item label={this.form[key].label}>
<el-input
value={this.form[key].value}
size="mini"
placeholder={`请输入${this.form[key].label}`}
onInput={(val) => {
this.form[key].value = val;
}}
></el-input>
</el-form-item>
);
},
profession(key){
const professionTypes = [
{
label: "老师",
value: "teacher",
},
{
label: "医生",
value: "doctor",
},
];
return (
<el-form-item label="职业">
<el-select
value={this.form[key].value}
placeholder="请选择"
size="mini"
onInput={(val) => {
this.form[key].value = val;
}}
>
{professionTypes.map((item) => {
return <el-option value={item.value} label={item.label}></el-option>;
})}
</el-select>
</el-form-item>
);
}
}
export default {
props: {
form: {
type: Object,
requried: true,
},
},
render(h) {
if (!this.form) {
return;
}
let keys = Object.keys(this.form);
let components = keys.map((key) => {
return items[this.form[key].type].call(this, key);
});
if (components) {
return <el-col>{components}</el-col>;
}
},
};
</script>