form封装

<template>
  <div class="newForm">
    <a-form
      ref="formRef"
      size="medium"
      :model="form"
      layout="inline"
      class="formClass"
      @submit-success="loginBtn"
    >
      <a-form-item
        v-for="(item, i) in props.formInfo"
        :key="i"
        :label-col-flex="
          props.formInfo[0].labelWidth != void 0
            ? props.formInfo[0].labelWidth
            : '150px'
        "
        :field="item.vmodelName"
        :label="item.label"
        row-class="rowClass"
        feedback
        :required="item.required"
        :style="{ width: item.width }"
      >
        <a-input
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-if="item.type == 'text'"
        /><!-- 文本 -->
        <a-input-number
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'number'"
        /><!-- 数字 -->
        <a-date-picker
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'datepicker'"
          style="width: 100%"
        /><!-- 天 日期 -->
        <a-range-picker
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'rangepicker'"
          style="width: 100%"
        /><!-- 时间范围 -->
        <a-month-picker
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'monthpicker'"
          style="width: 100%"
        /><!-- 月份 -->
        <a-select
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'select'"
        >
          <!-- 下拉单选 -->
          <a-option v-for="(it, is) in item.arr" :key="is" :value="it.id">{{
            it.name
          }}</a-option>
        </a-select>
        <a-select
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'selectcreate'"
          allow-create
        >
          <!-- 允许创建 -->
          <a-option v-for="(it, is) in item.arr" :key="is" :value="it.id">{{
            it.name
          }}</a-option>
        </a-select>
        <a-select
          :placeholder="item.placeholder"
          multiple
          :max-tag-count="2"
          allow-clear
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'multipleSelect'"
        >
          <!-- 下拉多选 -->
          <a-option v-for="(it, is) in item.arr" :key="is" :value="it.id">{{
            it.name
          }}</a-option>
        </a-select>
        <!-- 单选按钮 -->
        <a-space
          size="large"
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'aradio'"
        >
          <a-radio value="全">全</a-radio>
          <a-radio value="不全">不全</a-radio>
          <a-radio value="无">无</a-radio>
        </a-space>
        <!-- 多选按钮 -->
        <a-checkbox value="1" v-else-if="item.type == 'fuxuankuan'">{{
          item.labelname
        }}</a-checkbox>
        <!-- 文本域 -->
        <a-textarea
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          v-else-if="item.type == 'textarea'"
          allow-clear
        />
        <!-- 上传 -->
        <a-upload
          draggable
          :action="URL + '/bridge//sys/common/upload'"
          :placeholder="item.placeholder"
          v-model="form[item.vmodelName]"
          :headers="{ 'X-Access-Token': store.token2 }"
          @success="success"
          @before-remove="remove"
          @button-click="uploadClick(item)"
          v-else-if="item.type == 'upload'"
        />
        <!-- 计数器 -->
        <a-space
          direction="vertical"
          size="large"
          v-else-if="item.type == 'jishuqi'"
        >
          <a-input-number
            v-model="value"
            :style="{ width: '120px' }"
            :step="0.1"
            class="input-demo"
            :min="0"
            :max="100"
          />
        </a-space>
        <!-- 选择器 -->
        <a-space
          direction="vertical"
          size="large"
          v-else-if="item.type == 'select'"
        >
          <a-select :style="{ width: '300px' }" placeholder="Please select ...">
            <a-option>Beijing</a-option>
            <a-option>Shanghai</a-option>
            <a-option>Guangzhou</a-option>
          </a-select></a-space
        >
      </a-form-item>

      <slot name="form"></slot>
    </a-form>
  </div>
</template>

<script setup>
import { ref, watch, reactive, computed } from 'vue'
import { useStore } from '@/store/index'
let URL = ref(import.meta.env.VITE_BASE_URL)
let picurlArr = ref([])
let uploadModelName = ref('')
let form = ref({})
const emits = defineEmits(['parentDate'])
const store = useStore()
const formRef = ref() //获取元素
const props = defineProps({
  formInfo: {
    type: Object,
    default: {},
  },
  forms: {
    type: Object,
    default: {},
  },
})
form.value = props.forms
console.log(props.forms)
// 上传点击事件
const uploadClick = (item) => {
  uploadModelName.value = item.vmodelName
}
// 上传成功
const success = (val) => {
  let path = {
    url: 'https://resource.jszfti.com/' + val.response.message,
  }
  picurlArr.value.push(path)
  form.value[uploadModelName.value] = JSON.stringify(picurlArr.value)
}
// 删除
const remove = (val) => {
  let index = picurlArr.value.findIndex((item) => item.name == val.name)
  picurlArr.value.splice(index, 1)
  form.value[uploadModelName.value] = JSON.stringify(picurlArr.value)
}

const loginBtn = () => {
  // formRef.value = ''
  console.log(form.value, '传过来的from')
  formRef.value.validate((valid) => {
    if (valid == void 0) {
      emits('parentDate', form.value)
    }
    console.log(valid)
  })
}
defineExpose({ loginBtn })
// watch(
//   () => props.formInfo,
//   (nv, ov) => {
//     // form.val = {}
//     // setTimeout(() => {
//     //   nv.forEach((element) => {
//     //     form.value[element.vmodelName] = element.vmodel
//     //   })
//     // }, 0)
//   },
//   { deep: true, immediate: true }
// )
</script>

<style lang="scss" scoped>
.newForm {
  :deep(.arco-form-item-message) {
    display: none;
  }
  :deep(.arco-form-item) {
    margin-bottom: 15px;
    margin-right: 0;
  }
  :deep(.arco-form) {
    display: flex;
    flex-wrap: wrap;
  }
}
</style>

ElementPlus是Vue.js的UI库,其中包含一个强大的表单组件,可以使用它来创建复杂的表单。ElementPlus Form封装是为了简化表单的创建和管理。通过封装,我们可以抽象出通用的表单结构和校验规则,然后在具体的表单中进行调用和定制化。这减少了重复的代码,提高了代码的可维护性。 ElementPlus Form封装的优势有: 1. 具有通用性 封装的表单可以复用在多个页面中,避免了多个页面需要定义相同的表单结构和校验规则的情况。 2. 简化表单操作 封装的表单可以直接获取表单值和进行表单校验等操作,使用时只需关注数据和业务逻辑,减少了调用代码的复杂度。 3. 强化表单的可维护性 封装的表单通过抽象通用结构和规则,减少了冗余的代码,提高了代码的可维护性。 为了实现以上优势,ElementPlus Form封装的需要关注以下几个方面: 1. 表单结构的抽象 定义通用的表单结构,例如输入框、多选框、单选框等。 2. 校验规则的封装 定义标准的校验规则,例如正则表达式、必填、最大长度等。 3. 功能的扩展 提供与表单相关的功能,例如数据初始化、获取表单值、添加表单项、删除表单项、校验表单、重置表单等。 通过ElementPlus Form封装,我们可以方便地创建复杂的表单,并且简化表单操作,提高代码的可维护性。它可以应用于各种场景,例如用户注册、订单创建、数据搜索等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值