自己简单封装的from表单

30 阅读1分钟

image.png

像这种由后端返回数据生成的表单应该都有做过吧,现在产品的要求真是越来越过分了,给用户的选择变的非常自由,这种自由只会增加程序员的代码量,无论是前端还是后端.所以想成为一个合格的产品经理需要会些什么?我想转产品去给程序员提需求了

<template>
  <div>
    <a-form ref="userform" :model="formState" name="basic" :label-col="{ span: 6 }" :wrapper-col="{ span: 14 }"
      autocomplete="off">
      <a-row :gutter="[0, 10]">
        <a-col :span="8" :key="item.id" v-for="item in specimenFields">
          <a-form-item :label="item.name" :name="item.key" :rules="[
            {
              required: validateFields && item.fieldRequired === 1,
              message: '该项不能为空',
            },
          ]">
            <!--字符串-->
            <a-input v-model:value="formState[item.key]" :placeholder="item.memo"
              v-if="item.valueType === 0 && item.editType === 1" clearable :disabled="!editable" />
            <a-input v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 0 && item.editType != 1" clearable :disabled="!editable" />
            <!--整数-->
            <a-input-number v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 1 && item.editType === 1"
              :style="{ width: item.key == 'count' ? '75%' : '100%' }" :min="0" :disabled="!editable" />
            <a-input-number v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 1 && item.editType != 1" style="width: 100%" :min="0" :disabled="!editable" />
            <!--浮点数-->
            <a-input v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 2 && item.editType === 1" type="number" :min="0" :disabled="!editable" />
            <a-input v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 2 && item.editType != 1" type="number" :min="0" :disabled="!editable" />
            <!--日期-->
            <a-date-picker v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 3 && item.editType === 1" clearable style="width: 100%"
              :disabled="!editable"></a-date-picker>
            <a-date-picker v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 3 && item.editType != 1" clearable style="width: 100%"
              :disabled="!editable"></a-date-picker>
            <!--枚举-->
            <a-select v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 4 && item.editType === 1" filterable clearable :disabled="!editable">
              <a-select-option v-for="j in item.valueRange.split('|')" :value="j" :key="j">{{ j }}</a-select-option>
            </a-select>
            <a-select v-model:value="formState[item.key]" :placeholder="item.memo"
              v-else-if="item.valueType === 4 && item.editType != 1" filterable clearable :disabled="!editable">
              <a-select-option v-for="j in item.valueRange.split('|')" :value="j" :key="j">{{ j }}</a-select-option>
            </a-select>
            <a-button type="primary" v-if="item.key == 'count'" style="margin-left: 4%; height: 30px;width:21%"
              @click="submit">确定</a-button>
          </a-form-item>
        </a-col>
      </a-row>
    </a-form>
    <div style="text-align: center; margin-top: 42px" v-if="showbon">
      <a-button type="primary" :loading="false" @click="resetting" v-if="editable">重置</a-button>
      <a-button type="primary" @click="preserve" style="margin-left: 10px">{{ okText }}</a-button>
    </div>
  </div>
</template>

<script setup lang="tsx">
import { ref, reactive, defineEmits, defineExpose } from 'vue';
import { message, Modal } from 'ant-design-vue';
import dayjs, { Dayjs } from 'dayjs';
import { useRoute } from 'vue-router';
const route = useRoute();
const emit = defineEmits(['handle', 'register', 'resetting', 'delhandle']);
const props = defineProps({
  count: { type: Number, default: 0 },
  // 是否可编辑
  editable: { type: Boolean, default: true },
  // 是否显示按钮
  showbon: { type: Boolean, default: true },
  // 保存按钮文字
  okText: { type: String, default: '保存' },
  // 取消按钮文字
  cancelText: { type: String, default: '取消' },
  // 是否对字段验证
  validateFields: { type: Boolean, default: true },
});
const specimenFields = ref([]);
const userform = ref();
const formState: any = reactive({});
let editList = [];
const templateCV = async (id) => {
  editList = [];
  //请求拿数据
  let { result } = await aaaaa({ groupId: id })
  specimenFields.value = result;
};

const submit = async () => {
  Modal.confirm({
    title: '您确定要生成表格吗?',
    onOk: async () => {
      cancel();
    },
  });
};
// 回显
const Feedback = async (val) => {

};

defineExpose({
  Feedback,
  formState,
  resetting,
  preserve,
  templateCV,
});
</script>

<style lang="less" scoped>
.ant-col {
  height: 45px;
}
</style>

具体的自己去看吧,根据自己的数据去做处理