middleground_H5/components/baseForm/index.vue

297 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
@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>