297 lines
10 KiB
Vue
297 lines
10 KiB
Vue
<!--
|
||
@desc 自定义表单组件
|
||
@date 20230720
|
||
--------对于整个表单-----------
|
||
labelFormPosition: 表单域提示文字的位置,left-左侧,top-上方
|
||
borderFormBottom: 是否显示表单域的下划线边框
|
||
labelFormWidth: 提示文字的宽度,单位px
|
||
labelFormAlign:lable字体的对齐方式 默认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> |