<template> <el-form ref="form" :model="form" :label-position="labelPosition" :inline="inlineFlag" :label-width="labelWidth" :size="size" @submit.native.prevent="handleSearch()" class="el-form-self" :style="formStyle"> <el-col :xs="item.xs?item.xs:24" :sm="item.sm?item.sm:12" :md="item.md?item.md:8" :lg="item.lg?item.lg:8" :xl="item.xl?item.xl:6" v-for="(item,index) in forms" :key="index" v-if="!item.hidden"> <el-form-item :label="item.label?item.label+(item.hiddenColon?'':':'):''" :prop="item.prop" :rules="item.rules" :label-width="item.labelWidth || '110px'"> <!-- 输入框 --> <el-input v-if="item.type === 'input'" :id="item.id?item.id:''" v-model="form[item.prop]" :readonly="item.readonly" :disabled="item.disabled" :placeholder="item.placeholder" @focus="item.focusFunc?item.focusFunc($event):{}" @change="item.func?item.func($event):{}"> <span :slot="item.slot?item.slot:'append'" v-if="item.unit">{{item.unit}}</span> </el-input> <template v-if="item.type === 'textarea'"> <el-input type="textarea" :placeholder="item.placeholder" :rows="item.rows" :autosize="item.autosize" v-model="form[item.prop]" :minlength="item.minlength" :maxlength="item.maxlength" :show-word-limit="item.showLimit"></el-input> </template> <!-- 模糊查询输入 --> <el-autocomplete :popper-class="item.popperClass" style="width:100%;" v-else-if="item.type === 'autocomplete'" v-model="form[item.prop]" :fetch-suggestions="item.func" :placeholder="item.placeholder" @select="item.selectfun?item.selectfun($event):{}" clearable> <template slot-scope="{ item }"> <div class="name">{{ item.value }}</div> <span class="description">{{ item.description }}</span> </template> </el-autocomplete> <!-- 模糊查询选择 --> <el-select v-else-if="item.type === 'remote'" v-model="form[item.prop]" filterable remote reserve-keyword :placeholder="item.placeholder" :remote-method="item.remoteFunc"> <el-option v-for="(opt,optIndex) in item.opts" :key="optIndex" :label="opt.label" :value="item.isSelect?opt.selectValue:opt.value"> </el-option> </el-select> <!-- 日期区间 --> <el-date-picker v-else-if="item.type === 'daterange'" v-model="form[item.prop]" type="daterange" align="right" unlink-panels range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="item.options" :format="item.format" :value-format="item.valueFormat"> </el-date-picker> <!-- 日期 --> <el-date-picker v-else-if="item.type === 'date'" v-model="form[item.prop]" :type="item.dateType?item.dateType:'date'" :placeholder="item.placeholder" :picker-options="item.options" :format="item.format" :value-format="item.valueFormat"> </el-date-picker> <!-- 下拉框 --> <el-select v-else-if="item.type === 'select'" clearable filterable :disabled="item.disabled" v-model="form[item.prop]" :placeholder="item.placeholder?item.placeholder:'请选择'" @change="item.func?item.func($event):{}"> <el-option v-for="(opt,optIndex) in item.opts" :key="optIndex" :label="opt.label" :value="item.isSelect?opt.selectValue:opt.value"> </el-option> </el-select> <!-- 单选框 --> <el-radio :class="item.class" v-else-if="item.type === 'radio'" v-model="form[item.prop]" v-for="(opt,optIndex) in item.opts" :key="optIndex" :label="opt.value" @change="item.func?item.func($event):{}">{{opt.label}} </el-radio> <!-- 级联 --> <el-cascader v-else-if="item.type === 'cascader'" v-model="form[item.prop]" :style="'width:'+item.width" :options="item.list" :change-on-select="item.changeSelect" :show-all-levels="item.showLevel"></el-cascader> <!-- 文字 --> <span v-else-if="item.type === 'text'"> {{item.text?item.text:form[item.prop]}} </span> <!-- 数字输入框 --> <el-input-number v-else-if="item.type === 'number'" :controls="false" :min="item.min || 0" :precision="item.precision" v-model="form[item.prop]" :disabled="item.disabled || disabled" /> <!-- 图标 --> <span v-else-if="item.type === 'svg'"> <svg-icon :style="item.style" :icon-class="item.iconClass" @click.native="clickSvg(item.func)" class="form-svg"></svg-icon> </span> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :lg="24" v-if="lists" style="padding-left:120px;"> <el-button v-for="(btn,index) in lists" :key="index" :type="btn.type" :size="size" :icon="btn.icon" @click="btn.func" :style="btn.style"> {{btn.btnText}} </el-button> </el-col> </el-form> </template> <script> export default { data() { const form = {} const { forms } = this.$props forms.forEach(item => { if (!item.prop || item.hidden) return false if ( item.type === 'daterange' || item.type === 'checkboxList' || item.type === 'checkbox' || item.type === 'cascader' || (item.type === 'select' && item.multiple) ) { form[item.prop] = [] } else { form[item.prop] = '' } }) return { form } }, props: { size: { type: String, default: 'small' }, labelPosition: { type: String, default: 'right' }, labelWidth: { type: String }, formStyle: { type: Object }, inlineFlag: { type: Boolean, default: false }, forms: { type: Array }, // 表单组, lists: { type: Array } // 按钮组 }, methods: { // 查询 handleSearch() { this.$emit('handleSearch', this.form) }, // 重置 handleReset() { this.$refs.form.resetFields() this.handleSearch() }, handleConfirm() { this.loading = true this.$refs.form.validate(valid => { if (valid) { this.$emit('handleConfirm', this.form) } else { this.loading = false } }) }, // 表单赋值 initforms(formEdit) { this.$nextTick(() => { const form = {} this.forms.forEach(item => { if (!item.prop || item.hidden) return false if ( item.type === 'daterange' || item.type === 'checkboxList' || item.type === 'checkbox' || item.type === 'cascader' || (item.type === 'select' && item.multiple) ) { form[item.prop] = [] } else { form[item.prop] = '' } }) if (formEdit) { this.form = Object.assign(form, formEdit) } else { this.form = Object.assign({}, form) } this.loading = false if (this.$refs.form && this.$refs.form.clearValidate) { this.$refs.form.clearValidate() } }) }, // 绑定部分值(此时表单已渲染) initfields(obj) { this.form = Object.assign(this.form, obj) }, // 点击图标 clickSvg(str) { this.$emit(str) } } } </script> <style lang="scss" scoped> .el-form-self { margin: 20px 0; overflow: hidden; zoom: 1; .el-input, .el-select, .el-cascader, .el-date-editor { width: 100%; } .form-svg { cursor: pointer; } } </style>