|
@@ -0,0 +1,201 @@
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <van-form
|
|
|
+ @submit="onSubmit"
|
|
|
+ :disabled="formOption.disabled"
|
|
|
+ :readonly="formOption.readonly"
|
|
|
+ :label-width="formOption.labelWidth"
|
|
|
+ :label-align="formOption.labelAlign || 'top'"
|
|
|
+ :scroll-to-error="formOption.scroll"
|
|
|
+ ref="testForm"
|
|
|
+ >
|
|
|
+ <van-cell-group inset>
|
|
|
+ <van-field
|
|
|
+ v-for="i in formConfig"
|
|
|
+ v-model="formData[i.prop]"
|
|
|
+ :name="i.prop"
|
|
|
+ :label="i.label"
|
|
|
+ :type="i.itemType ? i.itemType : 'text'"
|
|
|
+ :readonly="getReadonly(i)"
|
|
|
+ :placeholder="i.placeholder"
|
|
|
+ :rules="getRules(i.prop)"
|
|
|
+ :is-link="i.isLink ? i.isLink : i.name == 'picker' ? true : false"
|
|
|
+ :clearable="i.clearable ? i.clearable : false"
|
|
|
+ @click="handleClickFiel(i)"
|
|
|
+ >
|
|
|
+ <template #input v-if="i.fielSlot == 'switch'">
|
|
|
+ <van-switch v-model="formData[i.prop]" />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #input v-else-if="i.fielSlot == 'groupChecked'">
|
|
|
+ <van-checkbox-group
|
|
|
+ v-model="formData[i.prop]"
|
|
|
+ direction="horizontal"
|
|
|
+ >
|
|
|
+ <van-checkbox name="1" shape="square">复选框 1</van-checkbox>
|
|
|
+ <van-checkbox name="2" shape="square">复选框 2</van-checkbox>
|
|
|
+ </van-checkbox-group>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template #input v-else-if="i.fielSlot == 'radio'">
|
|
|
+ <van-radio-group v-model="formData[i.prop]" direction="horizontal">
|
|
|
+ <van-radio
|
|
|
+ v-for="j in i.data"
|
|
|
+ :key="j.value"
|
|
|
+ :name="j.value || j.id"
|
|
|
+ >{{ j.label || j.title }}</van-radio
|
|
|
+ >
|
|
|
+ </van-radio-group>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- <van-popup
|
|
|
+ v-if="i.name == 'picker'"
|
|
|
+ v-model:show="i.showPicker"
|
|
|
+ round
|
|
|
+ :position="
|
|
|
+ i.pickerOption.position ? i.pickerOption.position : 'bottom'
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <van-picker
|
|
|
+ :columns="i.pickerOption.data"
|
|
|
+ @cancel="i.showPicker = false"
|
|
|
+ @confirm="() => onConfirm()"
|
|
|
+ />
|
|
|
+ </van-popup> -->
|
|
|
+ </van-field>
|
|
|
+ <van-popup
|
|
|
+ v-for="i in pickerData"
|
|
|
+ :key="i.prop"
|
|
|
+ v-model:show="i.showPicker"
|
|
|
+ round
|
|
|
+ :position="
|
|
|
+ i.pickerOption.position ? i.pickerOption.position : 'bottom'
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <van-picker
|
|
|
+ :columns="i.pickerOption.data"
|
|
|
+ @cancel="i.showPicker = false"
|
|
|
+ @confirm="() => onConfirm()"
|
|
|
+ />
|
|
|
+ </van-popup>
|
|
|
+ </van-cell-group>
|
|
|
+ <div style="margin: 16px">
|
|
|
+ <van-button round block type="primary" native-type="submit">
|
|
|
+ 提交
|
|
|
+ </van-button>
|
|
|
+ </div>
|
|
|
+ </van-form>
|
|
|
+ <!-- <div>{{ num }}</div> -->
|
|
|
+ <div v-for="i in pickerData">{{ i.label }}</div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import {
|
|
|
+ ref,
|
|
|
+ getCurrentInstance,
|
|
|
+ onMounted,
|
|
|
+ reactive,
|
|
|
+ computed,
|
|
|
+ toRefs,
|
|
|
+} from "vue";
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ modelValue: {
|
|
|
+ type: Object,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ formConfig: {
|
|
|
+ type: Array,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ formOption: {
|
|
|
+ type: Object,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ type: Object,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+});
|
|
|
+const proxy = getCurrentInstance().proxy;
|
|
|
+const { formConfig, formOption, rules } = toRefs(props);
|
|
|
+
|
|
|
+const formData = computed(() => {
|
|
|
+ return proxy.modelValue;
|
|
|
+});
|
|
|
+const emit = defineEmits(["update:modelValue"]);
|
|
|
+
|
|
|
+const onSubmit = () => {};
|
|
|
+//根据resurl获取数据
|
|
|
+
|
|
|
+// 获取验证规则
|
|
|
+const getRules = (prop) => {
|
|
|
+ if (rules.value.hasOwnProperty(prop) && rules.value[prop]) {
|
|
|
+ return rules.value[prop];
|
|
|
+ }
|
|
|
+};
|
|
|
+const getReadonly = (i) => {
|
|
|
+ return i.readonly ? i.readonly : i.name == "picker" ? true : false;
|
|
|
+};
|
|
|
+//
|
|
|
+const pickerData = ref([]);
|
|
|
+const handleClickFiel = (i) => {
|
|
|
+ if (i.name && i.name == "picker") {
|
|
|
+ const current = pickerData.value.find((x) => x.name == i.name);
|
|
|
+ current.showPicker = true;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ pickerData.value = formConfig.value.filter((x) => x.name == "picker");
|
|
|
+ console.log(pickerData.value, "wss");
|
|
|
+});
|
|
|
+
|
|
|
+const testForm = ref(null); // 延迟使用,因为还没有返回跟挂载
|
|
|
+
|
|
|
+const formDataInit = () => {
|
|
|
+ var map = {
|
|
|
+ input: "",
|
|
|
+ radio: null,
|
|
|
+ select: null,
|
|
|
+ checkbox: [],
|
|
|
+ date: "",
|
|
|
+ datetime: "",
|
|
|
+ daterange: [],
|
|
|
+ datetimerange: [],
|
|
|
+ year: null,
|
|
|
+ month: null,
|
|
|
+ switch: false,
|
|
|
+ inputNumber: 0,
|
|
|
+ cascader: [],
|
|
|
+ Solt: null,
|
|
|
+ Transfer: [],
|
|
|
+ Upload: { path: null, id: null, name: null },
|
|
|
+ password: "",
|
|
|
+ treeSelect: "",
|
|
|
+ json: {},
|
|
|
+ };
|
|
|
+ const formDataCopy = { ...formData.value };
|
|
|
+ for (let i = 0; i < proxy.formConfig.length; i++) {
|
|
|
+ const element = proxy.formConfig[i];
|
|
|
+
|
|
|
+ if (formDataCopy[element.prop] || element.type === "slot") {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (map[element.itemType] != undefined) {
|
|
|
+ formData.value[element.prop] = map[element.itemType];
|
|
|
+ } else {
|
|
|
+ formData.value[element.prop] = element.multiple ? [] : map[element.type];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ emit("update:modelValue", formData.value);
|
|
|
+};
|
|
|
+
|
|
|
+formDataInit();
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+</style>
|