效果图:
主要是使用vue + elmentUi 的from的基础上进行封装
使用改组件,是需要自定义从父组件传入一下字段表单字段
export const topicTypeMainTaskEdit: any = new Map([// 主任务可编辑状态['feasibleInstructions', // 督办件[{value: 'documentNum',formKey: ['documentNum'],rules: [{ required: true, message: '请输入办文编号', trigger: 'blur' },{ min: 0, max: 30, message: '办文编号字数长度超过限制' }],label: '办文编号',class: 'half-item',type: 'text',maxlength: 30},{value: 'taskTitle',formKey: ['taskTitle'],rules: [{ required: true, message: '请输入任务标题', trigger: 'blur' },{ min: 0, max: 300, message: '任务标题字数长度超过限制' }],label: '任务标题',class: 'half-item-all',isMate: true, // 填写时是否和关联任务的相应的字段匹配type: 'text',maxlength: 300},{value: 'taskSourceId',formKey: {value: 'taskSourceId',label: 'taskSource'},rules: [{ required: true, message: '请选择事项类型', trigger: 'change' }],hasSlot: {key: 'taskSource',label: '事项类型管理',type: 'managementMatters'},slotKey: 'taskSource',label: '事项类型',type: 'select',list: 'itemTypeList',options: () => JSON.parse(localStorage.getItem('store')).firstLevelTask.itemTypeData.filter(res => { return res.dicStatus * 1 === 1 })},{value: 'mainLeaderId',formKey: {value: 'mainLeaderId',label: 'mainLeader'},label: '批示领导',hasSlot: {key: 'mainLeader',label: '批示领导管理',type: 'managementMatters'},slotKey: 'mainLeader',type: 'select',multiple: true,list: 'leaderOptions',options: () => JSON.parse(localStorage.getItem('store')).firstLevelTask.mainLeaderData.filter(res => { return res.dicStatus * 1 === 1 })},{value: 'indicationTime',formKey: ['indicationTime'],label: '批示时间',class: 'half-item',type: 'date',noLimitCurrentDate: true // false为限制不能选当天以前的日期},{value: 'itemClaim',formKey: ['itemClaim'],rules: [{ min: 0, max: 300, message: '省领导批示内容字数长度超过限制' }],label: '省领导批示内容',class: '',type: 'textarea',showWordLimit: true,maxlength: 300,rows: 4},{value: 'workRequire',formKey: ['workRequire'],rules: [{ min: 0, max: 300, message: '领导跟批情况字数长度超过限制' }],label: '领导跟批情况',class: '',type: 'textarea',showWordLimit: true,maxlength: 300,rows: 4},{value: 'documentUrl',formKey: ['documentUrl'],// rules: [// { required: true, message: '请输入相关公文', trigger: 'blur' }// ],label: '相关公文',class: 'half-item',type: 'text',maxlength: 300},// {// value: 'documentUrl',// label: '相关公文',// formKey: ['documentUrl', 'mainDeptId', 'mainUnitId'],// type: 'authPanel',// authPanelType: 'department',// deptArray: [],// multiple: true// },{value: 'taskContent',formKey: ['taskContent'],rules: [{ required: true, message: '请输入任务描述', trigger: 'blur' },{ min: 0, max: 800, message: '任务描述字数长度超过限制' }],label: '任务描述',class: '',type: 'textarea',showWordLimit: true,isMate: true, // 填写时是否和关联任务的相应的字段匹配maxlength: 800,rows: 4},{value: 'mainUnitName',rules: [{ required: true, message: '请选择主办处室', trigger: 'blur' }],label: '主办处室',formKey: ['mainUnitName', 'mainDeptId', 'mainUnitId'],type: 'authPanel',authPanelType: 'department',deptArray: [],multiple: true,linkage: 'mainUnitName',fn: (data: any, formData: any) => {let interrupt = falseconst departId = Array.isArray(data) && data.map(item => {return item.departId})formData && formData.forEach(i => {if (i.key === 'assistUnitNames') {i.deptArray.forEach(j => {if (departId.indexOf(j.departId) > -1) {interrupt = trueMessage({message: `${j.name}不能同时作为主办、会办处室`,type: 'error'})}})}})return {interrupt}}},{value: 'assistUnitNames',label: '会办处室',formKey: ['assistUnitNames', 'assistDeptIds', 'assistUnitIds'],type: 'authPanel',authPanelType: 'department',deptArray: [],multiple: true,linkage: 'assistUnitNames',fn: (data: any, formData: any) => {let interrupt = falseconst departId = Array.isArray(data) && data.map(item => {return item.departId})formData && formData.forEach(i => {if (i.key === 'mainUnitName') {i.deptArray.forEach(j => {if (departId.indexOf(j.departId) > -1) {interrupt = trueMessage({message: `${j.name}不能同时作为主办、会办处室`,type: 'error'})}})}})return {interrupt}}},{value: 'leaderId',formKey: {value: 'leaderId',label: 'leader'},rules: [{ required: true, message: '请选择分管领导', trigger: 'change' }],label: '分管领导',hasSlot: {key: 'leader',label: '分管领导管理',type: 'managementMatters'},slotKey: 'leader',type: 'select',multiple: true,list: 'leaderOptions',options: () => JSON.parse(localStorage.getItem('store')).firstLevelTask.leaderData.filter(res => { return res.dicStatus * 1 === 1 })},{value: 'supervisionCycle',formKey: ['cycleType', 'supervisionCycle', 'supervisionCycleIds', 'firstSubmitTime'],rules: [{ required: true, message: '请选择报送时间' }],label: '报送时间',class: 'half-item',type: 'deliveryTime'},{value: 'limitDate',formKey: ['limitDate'],label: '办结期限',class: 'half-item',type: 'date'},{value: 'peopleArray',formKey: ['sendCopys', 'sendCopysId', 'sendCopysDeptId'],label: '抄送人员',type: 'authPanel',authPanelType: 'people',deptArray: [],multiple: true,hasSameDataDefaultProps: { isSame: 'complexId', parentId: 'departId', childrenId: 'userId' }}]],['keyWork', // 重点工作[{value: 'taskTitle',formKey: ['taskTitle'],rules: [{ required: true, message: '请输入任务标题', trigger: 'blur' },{ min: 0, max: 300, message: '任务标题字数长度超过限制' }],label: '任务标题',type: 'text',maxlength: 300},{value: 'workRequire',formKey: ['workRequire'],rules: [{ min: 0, max: 500, message: '描述字数长度超过限制' }],label: '描述',type: 'textarea',showWordLimit: true,maxlength: 500,rows: 4},{value: 'taskSourceId',formKey: {value: 'taskSourceId',label: 'taskSource'},rules: [{ required: true, message: '请选择事项类型', trigger: 'change' }],hasSlot: {key: 'taskSource',label: '事项类型管理',type: 'managementMatters'},slotKey: 'taskSource',label: '事项类型',type: 'select',list: 'itemTypeList',options: () => JSON.parse(localStorage.getItem('store')).firstLevelTask.itemTypeData.filter(res => { return res.dicStatus * 1 === 1 })},// {// value: 'documentUrl',// label: '相关公文',// formKey: ['documentUrl'],// type: 'authPanel',// authPanelType: 'department',// deptArray: [],// multiple: true// },{value: 'documentUrl',formKey: ['documentUrl'],label: '相关公文',class: 'half-item',type: 'text',maxlength: 300},{value: 'peopleArray',formKey: ['sendCopys', 'sendCopysId', 'sendCopysDeptId'],label: '抄送人员',type: 'authPanel',authPanelType: 'people',deptArray: [],multiple: true,hasSameDataDefaultProps: { isSame: 'complexId', parentId: 'departId', childrenId: 'userId' }}]]
])
然后先初始化表单字段的数据
const getTopicTypeData = this.topicTypeData.length > 0 ? this.topicTypeData : topicTypeData[this.topicTypeDataKey].get(this.otherTask || this.topicType)// const getTopicTypeData = this.topicTypeData.length > 0 ? this.topicTypeData : topicTypeData[this.topicTypeDataKey].get(this.topicType || this.otherTask)this.topicTypeMainTask = [...getTopicTypeData.map(item => {return { ...item, type: item.type === 'text' ? 'input' : item.type, isEdit: !item.disabled, key: item.value, value: '', options: typeof item.options === 'function' ? item.options() : item.options || '' }}), { key: 'fileJson', type: 'upload', value: '' }]this.topicTypeMainTask.forEach(item => {// if (item.type === 'authPanel' && item.authPanelType === 'people') {if (item.type === 'authPanel' && item.authPanelType === 'people' && !item.mixedData) {item.deptArray = this.taskData.sendCopysId ? this.resestPeopleArray(this.taskData.sendCopysId, this.taskData.sendCopys, this.taskData.sendCopysDeptId) : []item.value = this.taskData[item.key]} else if (item.type === 'authPanel' && (item.authPanelType === 'department' || (item.mixedData === true && item.authPanelType === 'people'))) {// else if (item.type === 'authPanel' && item.authPanelType === 'department') {if (item.disabled && typeof item.disabled === 'function') {item.disabled = item.disabled(!!(this.taskData.status && this.taskData.status === '4'))}item.deptArray = this.resestDeptArr(item.formKey)item.value = this.taskData[item.key]} else if (item.type === 'deliveryTime') {item.deliveryTime = {supervisionCycleIds: this.taskData.supervisionCycleIds,cycleType: this.taskData.cycleType,supervisionCycle: this.taskData.supervisionCycle,firstSubmitTime: this.taskData.firstSubmitTime}item.value = this.taskData[item.key]} else if (item.type === 'select') {if (this.topicType === 'coordinatingCommittee' && item.key === 'meetingTypeId') {item.value = '1'} else {if (item.multiple) {item.value = (this.taskData[item.key] && this.taskData[item.key].split(',')) || []} else {item.value = this.taskData[item.key]}}} else if (item.type === 'upload') {item.value = this.taskData[item.key] ? this.taskData[item.key] : '[]'} else {item.value = this.taskData[item.key]}})
这些字段都是存在在一个新ts文件中,如果对象有值,根据不用的表单类型进行赋值回显,没有的话就是空
表单组件中传入的值代表的意思
props: {isShowSearchBtn: { // 是否显示查询按钮type: Boolean,default: true},labelPosition: { // 表单文本标题的位置type: String,default: 'right'},labelWidth: { // 表单文本标题的宽度type: String,default: ''},formItemWidth: {type: String,default: '100%'},setStyle: {type: Object,default: () => {return {}}},updateModel: {type: Object,default: () => {return {}}},isRules: { // 是否要校验type: Boolean,default: true},rules: { // 校验规则type: Object,default: () => {return {}}},formData: { // 表单数据type: Array,default: () => {return []}},inline: { // 是否是行内type: Boolean,default: true},flexWrap: {type: Boolean,default: false}, // 控制表单是否换行justifyContent: { // 布局type: String,default: 'space-between'}, // 表单布局风格noCheck: {type: Boolean,default: true},pickerOptions: { // 时间日期表单的时间限制type: Object,default: () => {return {disabledDate(time) {return time.getTime() < Date.now() - 8.64e7}}}}},
如果表单数据对象遍历中出现slotKey,代表这个字段是使用插槽
在父组件中使用插槽,然后将根据不用字段显示不同的内容
表单组件里面的表单类型
<el-formref="formRef":inline="inline":model="model":rules="isRules ? rules : {}":label-position="labelPosition":label-width="labelWidth":style="{'flex-wrap': flexWrap ? 'nowrap' : 'wrap', 'justify-content' : justifyContent}"><el-form-itemv-for="(item,i) in formData":key="'form'+i":class="item.type + '-form'":label="item.label":prop="item.key":rules="isRules ? item.rules : []":error="item.success ? '' : item.message":style="{width: item.width ? item.width : formItemWidth, ...item.style }"><!-- 插槽 --><template v-if="item.slotKey"><slot :name="item.slotKey" :row="item" /></template><template v-else><!-- 输入框 --><el-inputv-if="item.type === 'input'"v-model="model[item.key]":disabled="!item.isEdit":maxlength="item.maxlength":show-word-limit="item.showWordLimit":placeholder="item.placeholder || '请输入'"@blur="handleBlur(item)"/><!-- 文本框 --><el-inputv-else-if="item.type === 'textarea'"v-model="model[item.key]":disabled="!item.isEdit":maxlength="item.maxlength":show-word-limit="item.showWordLimit"type="textarea":rows="3":placeholder="item.placeholder || '请输入'"@blur="handleBlur(item)"/><!-- 下拉框 --><el-selectv-else-if="item.type === 'select'"v-model="model[item.key]":disabled="!item.isEdit":multiple="item.multiple":placeholder="item.placeholder || '请选择'"@change="(val) => updateDeptArray(val, item)"><el-option v-for="(option, j) in item.options" :key="'option'+j" :label="option.label" :value="option.value" /></el-select><!-- 输入框(可以过滤) --><el-autocompletev-else-if="item.type === 'autocomplete'"v-model="model[item.key]":fetch-suggestions="(a,b) => querySearch(a,b,item.options)":placeholder="item.placeholder || '请输入'"@select="(val) => handleSelect(val, item)"/><!-- 单选框 --><el-radio-group v-else-if="item.type === 'radio'" v-model="model[item.key]"><el-radio v-for="(option, z) in item.options" :key="'option'+z" :label="option.value">{{ option.label }}</el-radio></el-radio-group><!-- 日期 --><el-date-pickerv-else-if="item.type === 'date'":key="'datePicker' + i"v-model="model[item.key]":picker-options="!item.noLimitCurrentDate && pickerOptions"type="date":placeholder="item.placeholder || '请选择'"value-format="yyyy-MM-dd"format="yyyy-MM-dd"/><!-- 日期时间 --><el-date-pickerv-else-if="item.type === 'daterange'":key="'daterangePicker' + i"v-model="model[item.key]":picker-options="!item.noLimitCurrentDate && pickerOptions"type="daterange"range-separator="至"start-placeholder="开始日期"end-placeholder="结束日期"value-format="yyyy-MM-dd"format="yyyy-MM-dd"/><!-- 数字 --><el-input-numberv-else-if="item.type === 'inputNumber'"v-model="model[item.key]":min="1"/><!-- 报送时间 --><div v-else-if="item.type === 'deliveryTime'" class="module-timeInput" @click="showSubMission"><el-input v-model="model[item.key]" :disabled="!item.isEdit" :placeholder=" item.placeholder || '请选择报送时间'" readonly /></div><!-- 单位或者人员组织构架 --><auth-panelv-else-if="item.type === 'authPanel'":auth-panel-params="item.params":mixed-data="item.mixedData":disabled="item.disabled":type="item.authPanelType":dept-array="item.deptArray":has-same-data-default-props="item.hasSameDataDefaultProps":multiple="item.multiple":stage-single="item.stageSingle":select-all="true"@update:deptArray="(val) => updateDeptArray(val, item)"/><!-- <auth-panel v-else-if="item.type === 'authPanel'" :disabled="!item.isEdit" :type="item.authPanelType" :dept-array="item.deptArray" :has-same-data-default-props="item.hasSameDataDefaultProps" :multiple="item.multiple" :select-all="true" @update:deptArray="(val) => updateDeptArray(val, item)" /> --><!-- 文件上传 --><template v-else-if="item.type === 'upload'"><el-form-item label=""><div class="group-item"><div class="exportFiles"><upload :file-data="fileList" @changeFile="getFileList" /> <!--:file-type="fileFormat"--></div></div><file-list v-for="file in fileList" :key="file.fileId" :file="file" :file-operate-btn="['eyes', 'closeBg']" @remove-file="removeFile" /></el-form-item></template></template></el-form-item><el-form-item><template v-if="isShowSearchBtn"><el-button type="primary" size="middle" @click="submitForm('formRef')">查询</el-button><el-button plain @click="resetForm('formRef')">重置</el-button></template><slot name="btnList" /></el-form-item></el-form>
完整代码
<template><div class="form" :style="setStyle"><el-formref="formRef":inline="inline":model="model":rules="isRules ? rules : {}":label-position="labelPosition":label-width="labelWidth":style="{'flex-wrap': flexWrap ? 'nowrap' : 'wrap', 'justify-content' : justifyContent}"><el-form-itemv-for="(item,i) in formData":key="'form'+i":class="item.type + '-form'":label="item.label":prop="item.key":rules="isRules ? item.rules : []":error="item.success ? '' : item.message":style="{width: item.width ? item.width : formItemWidth, ...item.style }"><!-- 插槽 --><template v-if="item.slotKey"><slot :name="item.slotKey" :row="item" /></template><template v-else><!-- 输入框 --><el-inputv-if="item.type === 'input'"v-model="model[item.key]":disabled="!item.isEdit":maxlength="item.maxlength":show-word-limit="item.showWordLimit":placeholder="item.placeholder || '请输入'"@blur="handleBlur(item)"/><!-- 文本框 --><el-inputv-else-if="item.type === 'textarea'"v-model="model[item.key]":disabled="!item.isEdit":maxlength="item.maxlength":show-word-limit="item.showWordLimit"type="textarea":rows="3":placeholder="item.placeholder || '请输入'"@blur="handleBlur(item)"/><!-- 下拉框 --><el-selectv-else-if="item.type === 'select'"v-model="model[item.key]":disabled="!item.isEdit":multiple="item.multiple":placeholder="item.placeholder || '请选择'"@change="(val) => updateDeptArray(val, item)"><el-option v-for="(option, j) in item.options" :key="'option'+j" :label="option.label" :value="option.value" /></el-select><!-- 输入框(可以过滤) --><el-autocompletev-else-if="item.type === 'autocomplete'"v-model="model[item.key]":fetch-suggestions="(a,b) => querySearch(a,b,item.options)":placeholder="item.placeholder || '请输入'"@select="(val) => handleSelect(val, item)"/><!-- 单选框 --><el-radio-group v-else-if="item.type === 'radio'" v-model="model[item.key]"><el-radio v-for="(option, z) in item.options" :key="'option'+z" :label="option.value">{{ option.label }}</el-radio></el-radio-group><!-- 日期 --><el-date-pickerv-else-if="item.type === 'date'":key="'datePicker' + i"v-model="model[item.key]":picker-options="!item.noLimitCurrentDate && pickerOptions"type="date":placeholder="item.placeholder || '请选择'"value-format="yyyy-MM-dd"format="yyyy-MM-dd"/><!-- 日期时间 --><el-date-pickerv-else-if="item.type === 'daterange'":key="'daterangePicker' + i"v-model="model[item.key]":picker-options="!item.noLimitCurrentDate && pickerOptions"type="daterange"range-separator="至"start-placeholder="开始日期"end-placeholder="结束日期"value-format="yyyy-MM-dd"format="yyyy-MM-dd"/><!-- 数字 --><el-input-numberv-else-if="item.type === 'inputNumber'"v-model="model[item.key]":min="1"/><!-- 报送时间 --><div v-else-if="item.type === 'deliveryTime'" class="module-timeInput" @click="showSubMission"><el-input v-model="model[item.key]" :disabled="!item.isEdit" :placeholder=" item.placeholder || '请选择报送时间'" readonly /></div><!-- 单位或者人员组织构架 --><auth-panelv-else-if="item.type === 'authPanel'":auth-panel-params="item.params":mixed-data="item.mixedData":disabled="item.disabled":type="item.authPanelType":dept-array="item.deptArray":has-same-data-default-props="item.hasSameDataDefaultProps":multiple="item.multiple":stage-single="item.stageSingle":select-all="true"@update:deptArray="(val) => updateDeptArray(val, item)"/><!-- <auth-panel v-else-if="item.type === 'authPanel'" :disabled="!item.isEdit" :type="item.authPanelType" :dept-array="item.deptArray" :has-same-data-default-props="item.hasSameDataDefaultProps" :multiple="item.multiple" :select-all="true" @update:deptArray="(val) => updateDeptArray(val, item)" /> --><!-- 文件上传 --><template v-else-if="item.type === 'upload'"><el-form-item label=""><div class="group-item"><div class="exportFiles"><upload :file-data="fileList" @changeFile="getFileList" /> <!--:file-type="fileFormat"--></div></div><file-list v-for="file in fileList" :key="file.fileId" :file="file" :file-operate-btn="['eyes', 'closeBg']" @remove-file="removeFile" /></el-form-item></template></template></el-form-item><el-form-item><template v-if="isShowSearchBtn"><el-button type="primary" size="middle" @click="submitForm('formRef')">查询</el-button><el-button plain @click="resetForm('formRef')">重置</el-button></template><slot name="btnList" /></el-form-item></el-form><!--报送周期组件--><submission-dialog ref="submissionDialog" :sub-mission-data="subMissionData" @confirm="confirmMission" /></div>
</template>
<script>
import authPanel from '@/components/authPanel/index.vue'
import submissionDialog from '@/components/Dialog/submissionDialog.vue'
import upload from '@/components/UploadCom/index.vue'
import fileList from '@/components/fileList/index.vue'
export default {name: 'InitForm',components: { authPanel, upload, fileList, submissionDialog },props: {isShowSearchBtn: { // 是否显示查询按钮type: Boolean,default: true},labelPosition: { // 表单文本标题的位置type: String,default: 'right'},labelWidth: { // 表单文本标题的宽度type: String,default: ''},formItemWidth: {type: String,default: '100%'},setStyle: {type: Object,default: () => {return {}}},updateModel: {type: Object,default: () => {return {}}},isRules: { // 是否要校验type: Boolean,default: true},rules: { // 校验规则type: Object,default: () => {return {}}},formData: { // 表单数据type: Array,default: () => {return []}},inline: { // 是否是行内type: Boolean,default: true},flexWrap: {type: Boolean,default: false}, // 控制表单是否换行justifyContent: { // 布局type: String,default: 'space-between'}, // 表单布局风格noCheck: {type: Boolean,default: true},pickerOptions: { // 时间日期表单的时间限制type: Object,default: () => {return {disabledDate(time) {return time.getTime() < Date.now() - 8.64e7}}}}},data() {return {model: {},fileList: [],linkageDataKey: {},subMissionData: { // 报送时间回显的参数格式supervisionCycleIds: '',cycleType: '',firstSubmitTime: '',supervisionCycle: ''},defaultProps: { // 初始化表单key值value: 'value', // 表单显示的值authPanel: 'list' // 获取选择单位/选择人员所选择的对象值}}},watch: {updateModel: {handler(newV) {if (newV) {this.model[Object.keys(newV)[0]] = newV[Object.keys(newV)[0]]}},deep: true}},created() {this.init()},methods: {init() {this.formData.forEach(item => {!item.defaultProps && (item.defaultProps = this.defaultProps)if (item.type === 'deliveryTime') {this.subMissionData = item.deliveryTime ? item.deliveryTime : this.subMissionData}if (item.linkage) {this.linkageDataKey[item.linkage] = this.formData.find(data => {return data.key === item.linkage})const linkageType = Array.isArray(this.linkageDataKey[item.linkage].value)if ((linkageType && this.linkageDataKey[item.linkage].value.length > 0) || (!linkageType && this.linkageDataKey[item.linkage].value)) {if (item.fn(this.linkageDataKey[item.linkage].value).then) {item.fn(this.linkageDataKey[item.linkage].value).then(() => {this.$set(this.model, item.key, Array.isArray(item.value) ? item.value.map(String) : item.value)})} else {this.$set(this.model, item.key, Array.isArray(item.value) ? item.value.map(String) : item.value)}}} else {this.$set(this.model, item.key, item.value)// if (item.type === 'select' && item.multiple) {// if (item.value && item.value.length > 0) {// this.$set(this.model, item.key, item.value)// } else {// this.$set(this.model, item.key, [])// if (!item.message) {// this.$nextTick(() => {// this.$refs['formRef'].clearValidate([item.key])// })// }// }// } else {// this.$set(this.model, item.key, item.value)// }// this.model[item.key] = item.value}if (item.type === 'upload') {this.fileList = item.value ? JSON.parse(item.value) : []}})},// 清除校验// clearRules(value) {// this.$nextTick(() => {// if (value) {// this.$refs['formRef'].clearValidate([value])// } else {// this.$refs['formRef'].resetFields()// }// })// },querySearch(queryString, cb, options) {const option = options || []cb(option.filter(item => {return item.value.indexOf(queryString) > -1}))},handleSelect(val, data) {data.formKey.forEach(item => {if (item.indexOf('Id') > -1) {this.$set(this.model, item, val.id)} else {this.$set(this.model, item, val.value)}})},submitForm(formEl) {if (!formEl) returnthis.$emit('submit', this.model)},resetForm(formEl) {if (!formEl) returnthis.$refs[formEl].resetFields()this.$emit('reset', this.model)},getTreeSelectData(data) {this.$set(this.model, 'treeSelectData', data)},updateDeptArray(data, formItem) {let interrupt = false // 是否中断赋值formItem.type === 'authPanel' && this.$set(this.model, formItem.key, data.map(item => { return item.name }).join(','))this.$refs.formRef.clearValidate(formItem.key)this.formData.forEach(item => {if (item.linkage === formItem.key) {interrupt = item.fn(data, this.formData).interrupt}if (item.type === 'authPanel' && item.key === formItem.key && !interrupt) {item.deptArray = data}})if (!interrupt) {this.$emit('update:formData', this.formData)}},async getFormData(callback) {if (!this.$refs.formRef) returnconst initFormData = this.initSaveFormData(JSON.parse(JSON.stringify(this.formData)))let data = {}await this.$refs.formRef.validate((valid) => {const errmsg = '验证不通过'if (valid) {data = callback ? callback({ data: initFormData, valid: true }) : { data: initFormData, valid: true }} else {data = { valid: false }}})return data// if (noCheck) {// return this.checkFormData(callback, initFormData)// }},getFormDataNoCheck(callback) { // 获取数据不需要校验if (!this.$refs.formRef) returnconst initFormData = this.initSaveFormData(JSON.parse(JSON.stringify(this.formData)))this.$refs.formRef.clearValidate()return (callback ? callback({ data: initFormData, valid: true }) : { data: initFormData, valid: true })},initSaveFormData(initFormData) {Object.keys(this.model).forEach(modelKey => {initFormData.forEach(formData => {if (formData.key === modelKey) {if (formData.key === 'supervisionCycle') {formData.deliveryTime = this.subMissionData}formData[formData.defaultProps.value] = this.model[modelKey]}})})return initFormData},// 显示报送周期showSubMission() {this.$refs.submissionDialog.showVisilie()},// 回显周期数据confirmMission(callData) {this.$set(this.model, 'supervisionCycle', callData['supervisionCycle'])Object.keys(this.subMissionData).forEach(item => {this.$set(this.subMissionData, item, callData[item])})},getFileList(fileList) {this.fileList = fileList.map((item, index) => {return {source: item.source || '',fileId: item.fileId,fileName: item.name,name: item.name,fileSize: item.fileSize,sort: index + 1,suffixName: item.iconType}})this.$set(this.model, 'fileJson', JSON.stringify(this.fileList))},removeFile(data) {this.fileList = this.fileList.filter(item => {return item.fileId !== data.fileId})this.$set(this.model, 'fileJson', JSON.stringify(this.fileList))},// 输入框失去焦点handleBlur(data) {if (data.isMate) {console.log('1440', data, this.model[data.key], this.formData)this.$emit('getMatched', data, this.model, this.formData)}}}
}
</script><style lang="scss" scoped>// .el-form{// padding: 27px 16px 9px;// }.form{::v-deep .el-autocomplete{width: 100%;}::v-deep .el-form-item{&:last-of-type{margin-right: 0;}}::v-deep .el-form--inline{display: flex;justify-content: space-between;}::v-deep .el-form--inline{.el-form-item{display: flex;margin-right: 0;}}::v-deep .el-tag{line-height: initial;}::v-deep .el-form-item__content{width: 100%;flex: 1}::v-deep .el-date-editor.el-input, ::v-deep .el-date-editor.el-input__inner{width: inherit;}}.el-select{width: 100%;}.hint{margin-left: 6px;}// .dialogObj-text-box {// margin-left: 12px;// min-width: 60px;// &:hover {// color: #1a8af9;// cursor: pointer;// }// }</style>