帮我用vue+element-ui封装个el-tabs 下分块包含 el-form的组件
时间: 2023-05-23 12:02:10 浏览: 250
基于Vue+element-ui 的Table二次封装的实现
好的,我可以为您提供代码示例,实现用 Vue Element-UI 封装一个带有分块、包含 el-form 的 el-tabs 组件。代码如下:
```vue
<template>
<div class="xs-tabs-form-container">
<el-tabs v-model="activeTab" style="height: 100%">
<el-tab-pane :label="pane.label" :key="index" v-for="(pane, index) in tabPanes">
<el-form :model="formData" :rules="formRules" ref="xsForm" label-width="100px">
<el-row :gutter="20" v-for="(element, rowIndex) in pane.elements" :key="rowIndex">
<el-col :span="12" v-for="(item, colIndex) in element" :key="colIndex">
<el-form-item :label="item.label" :prop="item.prop">
<template v-if="item.custom">
<slot :name="item.prop" :item="item"></slot>
</template>
<template v-else>
<el-input v-model="formData[item.prop]"></el-input>
</template>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
export default {
name: "XsTabsForm",
props: {
tabPanes: {
type: Array, // [{label: 'Tab 1', elements: [[{label: 'Field 1', prop: 'field1'}]]}]
required: true
},
rules: {
type: Object, // {field1: [{required: true, message: '不能为空', trigger: 'blur'}]}
required: true
}
},
data() {
return {
activeTab: 0,
formData: {}
};
},
computed: {
formRules() {
const rules = {};
for (let key of Object.keys(this.formData)) {
if (this.rules[key]) {
rules[key] = this.rules[key];
}
}
return rules;
}
},
methods: {
submitForm() {
this.$refs['xsForm'].validate((valid) => {
if (valid) {
this.$emit('submit-form', this.formData);
} else {
this.$message.error('表单校验失败,请检查输入');
}
});
}
}
};
</script>
<style scoped>
.xs-tabs-form-container {
height: 100%;
}
</style>
```
您可以通过 `tabPanes` 和 `rules` 两个参数传递组件中的标签页面和表单控制参数。每个标签页面可以包含多个行,每行包含多个表单项。可以选择使用默认的输入框,也可以通过 `item.custom` 参数自定义表单控件。您可以在 `submit-form` 事件中获取表单数据。
阅读全文