vue3 ts 动态表单原理

ts 复制代码
<template>
  <div class="form">
    <el-form
      :inline="dynamicForm.inline"
      :label-width="dynamicForm.labelWidth"
      ref="formRef"
      :model="dynamicForm"
    >
      <el-form-item
        v-for="(column, index) in dynamicForm.columns"
        :key="column.columnName + '.' + index"
        :label="column.columnLabel"
        :prop="column.columnProp"
      >
        <el-input v-model="column.columnValue" />
      </el-form-item>

      <el-form-item v-if="dynamicForm.buttonEnabled">
        <el-button type="primary" @click="submitForm(formRef)"> 查询 </el-button>
        <el-button @click="resetForm(formRef)">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>
<style lang="css"></style>
<script setup lang="ts">
import { ref } from 'vue'
import type { FormInstance } from 'element-plus'
interface FormColumn {
  columnName: string
  columnLabel: string
  columnType: string
  columnProp: string
  columnWidth: string
  columnValue?: object
  formElement?: string
  optionValue?: string
}
const formRef = ref<FormInstance>()
const formData = ref({})

const submitForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) return
  await formEl.validate((valid, fields) => {
    if (valid) {
      //console.log('submit!')
      //console.log(props.dynamicForm)
      console.log(formEl)
      console.log(JSON.stringify(formEl.fields))
      console.log(formData)
      emit('submitForm', props.dynamicForm)
    } else {
      console.log('error submit!', fields)
    }
  })
}

const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  props.dynamicForm.columns?.forEach((column) => {
    column.columnValue = new Object()
  })
  formEl.resetFields()
  emit('resetForm')
}

const props = defineProps<{
  dynamicForm: {
    inline: boolean
    labelWidth: string
    columns: FormColumn[]
    buttonEnabled?: boolean
  }
}>()

const emit = defineEmits<{
  (e: 'submitForm', formData: object | undefined): void
  (e: 'resetForm'): void
}>()
console.log(props.dynamicForm.columns)
</script>

使用,数组转对象 对象转数组

ts 复制代码
const saveFormCallbak = () => {
  //console.log(saveForm)
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const arr: any[][] = []
  saveForm.columns.forEach((colunm: FormColumn) => {
    arr.push([colunm.columnName, colunm.columnValue])
  })
  const obj = Object.fromEntries(arr)
  // console.log(obj)
  save(obj)
    .then(() => {
      loadDataPage()
    })
    .finally(() => {
      saveFormVisible.value = false
    })
}
const updateFormCallbak = () => {
  //console.log(updateForm)
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const arr: any[][] = []
  updateForm.columns.forEach((colunm: FormColumn) => {
    arr.push([colunm.columnName, colunm.columnValue])
  })
  const obj = Object.fromEntries(arr)
  //console.log(obj)
  update(obj.id, obj)
    .then(() => {
      loadDataPage()
    })
    .finally(() => {
      updateFormVisible.value = false
    })
}

参考element-plus动态添加表单项

ts 复制代码
    <!-- <el-form-item
      v-for="(domain, index) in dynamicValidateForm.domains"
      :key="domain.columnName"
      :label="domain.columnLabel"
      :prop="'domains.' + index + '.value'"
      :rules="{
        required: true,
        message: 'domain can not be null',
        trigger: 'blur',
      }"
    >
      <el-input v-model="domain.value" />
      <el-button class="mt-2" @click.prevent="removeDomain(domain)"> Delete </el-button>
    </el-form-item> -->
相关推荐
为美好的生活献上中指19 分钟前
java每日精进 5.11【WebSocket】
java·javascript·css·网络·sql·websocket·网络协议
augenstern4161 小时前
webpack重构优化
前端·webpack·重构
海拥✘1 小时前
CodeBuddy终极测评:中国版Cursor的开发革命(含安装指南+HTML游戏实战)
前端·游戏·html
寧笙(Lycode)1 小时前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
asqq81 小时前
CSS 中的 ::before 和 ::after 伪元素
前端·css
拖孩2 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
苹果电脑的鑫鑫2 小时前
element中表格文字剧中可以使用的属性
javascript·vue.js·elementui
Hejjon2 小时前
Vue2 elementUI 二次封装命令式表单弹框组件
前端·vue.js
一丝晨光3 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
小堃学编程3 小时前
前端学习(3)—— CSS实现热搜榜
前端·学习