middleground_H5/components/baseForm/index.vue

297 lines
10 KiB
Vue
Raw Permalink Normal View History

2024-09-20 15:55:17 +08:00
<!--
@desc 自定义表单组件
@date 20230720
--------对于整个表单-----------
labelFormPosition: 表单域提示文字的位置left-左侧top-上方
borderFormBottom: 是否显示表单域的下划线边框
labelFormWidth: 提示文字的宽度单位px
labelFormAlignlable字体的对齐方式 默认left 可选 center/right
-->
<template>
<view>
<u--form :labelPosition="labelFormPosition" :borderBottom="borderFormBottom" :labelWidth="labelFormWidth"
class="baseform" :labelAlign="labelFormAlign" :labelStyle="labelStyle" :model="formModel" :rules="formRules"
ref="baseForm">
<view style="padding-bottom: 40rpx;">
<u-row v-for="(item,index) in formRow" :key="index">
<u-col v-for="(row,rowIndex) in item.uCol" :span="row.span ? row.span : spanNumber" :key="rowIndex">
<u-form-item v-if="row.tag == 'input'" :label="row.label" :prop="row.prop" ref="item1"
:borderBottom="row.borderBottom" @click="handlerRowInputClickEvent(row,rowIndex)"
:labelWidth="row.labelWidth" :labelPosition="row.labelPosition" :rightIcon="row.rightIcon"
:leftIcon="row.leftIcon" :required="row.required"
:class="(getRule(row.prop)?'ruleFormClass ':'')">
<u--input v-if="row.type == 'uInput'" :placeholder="row.placeholder" clearable
v-model="formModel.formData[row.prop]" :suffixIcon="row.suffixIcon"
:disabled="row.disabled" :border="row.border"
:disabledColor="row.disabledColor"></u--input>
<u--textarea v-if="row.type == 'uTextarea'" v-model="formModel.formData[row.prop]"
:height="row.height?row.height: 100" :maxlength="row.maxlength ? row.maxlength: '-1'"
:placeholder="row.placeholder" :suffixIcon="row.suffixIcon" :disabled="row.disabled"
:border="row.border" :disabledColor="row.disabledColor"></u--textarea>
<u-radio-group v-if="row.type == 'uRadio'" v-model="formModel.formData[row.prop]"
@change="handlerRadioChange($event,row,rowIndex)">
<u-radio :customStyle="{marginRight: '16px'}" v-for="(item, index) in row.options"
:key="index" :label="item.label" :name="item.value">
</u-radio>
</u-radio-group>
<u-checkbox-group v-if="row.type == 'uCheckbox'" v-model="formModel.formData[row.prop]"
shape="square" placement="column" @change="handlerCheckboxChange($event,row,rowIndex)">
<u-checkbox :customStyle="{marginBottom: '8px'}" v-for="(item, index) in row.options"
:key="index" :label="item.label" :name="item.value"
:disabled="item.disabled ? true:false">
</u-checkbox>
</u-checkbox-group>
</u-form-item>
<!-- 简单下拉框 -->
<u-form-item v-if="row.tag == 'select'" :label="row.label" :prop="row.prop" ref="item2"
:class="(getRule(row.prop)?'ruleFormClass ':'')" :borderBottom="row.borderBottom"
@click="row.show = true" :labelWidth="row.labelWidth" :labelPosition="row.labelPosition"
:rightIcon="row.rightIcon" :leftIcon="row.leftIcon" :required="row.required">
<!-- keyName自定义需要展示的text属性键名 -->
<u-picker :show="row.show" :columns="[row.options]"
:closeOnClickOverlay="row.closeOnClickOverlay ? true:false"
@close="handlerSelectClose(row,rowIndex)" @cancel="handlerSelectClose(row,rowIndex)"
@confirm="selectConfirm($event,row,rowIndex)" :keyName="row.keyName"></u-picker>
<u--input :placeholder="row.placeholder" v-model="formModel.formData[row.prop]" clearable
:suffixIcon="row.suffixIcon ? row.suffixIcon:''" :disabled="row.disabled"
:border="row.border" :disabledColor="row.disabledColor"></u--input>
</u-form-item>
<!-- 此组件用于单个选择日期范围选择日期等
mode
为single只能选择单个日期
为multiple可以选择多个日期
为range可以选择日期范围
-->
<u-form-item v-if="row.tag == 'calendar'" :label="row.label" :prop="row.prop" ref="item2"
:class="(getRule(row.prop)?'ruleFormClass ':'')" :borderBottom="row.borderBottom"
@click="row.show = true" :labelWidth="row.labelWidth" :labelPosition="row.labelPosition"
:rightIcon="row.rightIcon" :leftIcon="row.leftIcon" :required="row.required">
<!-- keyName自定义需要展示的text属性键名 -->
<u-calendar :show="row.show" :mode="row.mode" :showTitle="row.title" round="10"
:closeOnClickOverlay="row.closeOnClickOverlay ? true:false"
@close="handlerCalendarClose(row,rowIndex)"
@confirm="calendarConfirm($event,row,rowIndex)" :maxDate="row.maxDate"
:minDate="row.minDate" :monthNum="row.monthNum"></u-calendar>
<u--input :placeholder="row.placeholder" v-model="formModel.formData[row.prop]"
suffixIcon="calendar" clearable :disabled="row.disabled" :border="row.border"
:disabledColor="row.disabledColor"></u--input>
</u-form-item>
<!-- 此选择器用于时间日期
mode 配置选择何种日期格式datetime年月日时分 date为日期选择time为时间选择year-month为年月选择
参数minDate和maxDate可以设置最大值和最小值传入时间戳
-->
<u-form-item v-if="row.tag == 'datetime'" :label="row.label" :prop="row.prop" ref="item2"
:class="(getRule(row.prop)?'ruleFormClass ':'')" :borderBottom="row.borderBottom"
@click="row.show = true" :labelWidth="row.labelWidth" :labelPosition="row.labelPosition"
:rightIcon="row.rightIcon" :leftIcon="row.leftIcon" :required="row.required">
<!-- keyName自定义需要展示的text属性键名 -->
<u-datetime-picker :show="row.show" :mode="row.mode" :value="defaultTime(row)"
:closeOnClickOverlay="row.closeOnClickOverlay ? true:false" :maxDate="row.maxDate"
:minDate="row.minDate" @confirm="dateTimeConfirm($event,row,rowIndex)"
@cancel="handlerDateTimeClose(row,rowIndex)"
@close="handlerDateTimeClose(row,rowIndex)"></u-datetime-picker>
<u--input :placeholder="row.placeholder" v-model="formModel.formData[row.prop]" clearable
suffixIcon="arrow-right" :disabled="row.disabled" :border="row.border"
:disabledColor="row.disabledColor"></u--input>
</u-form-item>
</u-col>
</u-row>
</view>
</u--form>
</view>
</template>
<script>
export default {
props: {
labelFormPosition: {
type: String,
default: "left"
},
borderFormBottom: {
type: Boolean,
default: true
},
labelFormWidth: {
type: [Number, String],
default: 100
},
labelFormAlign: {
type: String,
default: "left"
},
labelStyle: {
type: Object,
default: () => {
return {
padding: '10px 0 10px 10px'
};
},
},
// 表单验证规则
formRules: {
type: Object,
default: () => {
return {};
},
},
// 表单页面结构数据
formRow: {
type: Array,
default: () => {
return [];
},
},
},
data() {
return {
spanNumber: 12,
formModel: {
formData: {
hour: ''
}
},
}
},
mounted() {},
methods: {
bbb(a, b) {
console.log(a, "测试", b)
},
defaultTime(row) {
if (row.mode == 'datetime' || row.mode == 'date' || row.mode == 'year-month') {
return Number(new Date())
} else if (row.mode == 'time') {
return new Date().toLocaleTimeString().slice(0, 5)
} else {
return
}
},
handlerRowInputClickEvent(row, index) {
this.$emit("handlerRowInputClickEvent", row, index)
},
// 下拉框确认事件
selectConfirm(value, row, index) {
this.$emit("selectConfirm", value, row, index)
row.show = false
},
// 下拉框关闭事件
handlerSelectClose(row, index) {
row.show = false
},
// 日期关闭事件
handlerCalendarClose(row, index) {
row.show = false
},
// 日期时间关闭事件
handlerDateTimeClose(row, index) {
row.show = false
},
// 日期确认事件
calendarConfirm(value, row, index) {
this.$emit("calendarConfirm", value, row, index)
row.show = false
},
// 日期时间确认事件
dateTimeConfirm(e, row, index) {
const timeFormat = uni.$u.timeFormat
let time = ''
if (row.mode == 'datetime') {
time = timeFormat(e.value, 'yyyy-mm-dd hh:MM')
} else if (row.mode == 'date') {
time = timeFormat(e.value, 'yyyy-mm-dd')
} else if (row.mode == 'year-month') {
time = timeFormat(e.value, 'yyyy-mm')
} else if (row.mode == 'time') {
// time = timeFormat(e.value, 'hh:MM')
time = e.value
} else {
time = ''
}
this.$emit("dateTimeConfirm", time, row, index)
row.show = false
},
// 复选框change事件
handlerCheckboxChange(e, row, rowIndex) {
this.$emit("handlerCheckboxChange", e, row, rowIndex)
},
// 单选框change事件
handlerRadioChange(e, row, rowIndex) {
this.$emit("handlerRadioChange", e, row, rowIndex)
},
setField(propLabel, value) {
this.$set(this.formModel.formData, propLabel, value);
},
incomingParameters(vale) {
for (let i in vale) {
this.setField(i, vale[i]);
}
},
// 表单提交
submitForm(formName) {
let formRules = {
formData: {
...this.formRules
}
}
// this.formRules = formRules
console.log(this.$refs[formName].validate(), "formRules")
this.$refs[formName].validate((valid) => {
if (valid) {
console.log(valid)
// this.$emit('onSubmit', this.formModel.formData)
} else {
console.log('error submit!!');
return false
}
})
},
// 表单重置
resetForm(formName) {
this.choiceAssignment({})
},
//弹窗赋值
choiceAssignment(value) {
this.formModel.formData = Object.assign({}, value)
},
getRule(rowList) {
let requiredType = false
if (this.formRules[rowList] && this.formRules[rowList].length > 0) {
this.formRules[rowList].forEach(el => {
if (el.required) {
requiredType = true
}
})
}
return requiredType
}
},
}
</script>
<style lang="scss" scoped>
.baseform {
padding: 20rpx;
}
.u-form-item {
padding: 0 30rpx;
}
.u-popup {
flex: none;
}
::v-deep .u-form-item__body__right__message {
margin: 0 !important;
}
::v-deep .ruleFormClass {
.u-line {
border-bottom: 2rpx solid #E6A23C !important;
}
}
</style>