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> -->
相关推荐
ᖰ・◡・ᖳ9 分钟前
JavaScript:神奇的ES6之旅
前端·javascript·学习·es6
app出海创收老李14 分钟前
海外独立创收日记(5)-上个月收入回顾与本月计划
前端·后端·程序员
前端Hardy15 分钟前
HTML&CSS:一眼心动的 SVG 时钟
前端·javascript·css
TTGGGFF18 分钟前
Streamlit:CSS——从基础到实战美化应用
前端·css
app出海创收老李27 分钟前
海外独立创收日记(4)-第一笔汇款
前端·后端·程序员
Takklin27 分钟前
React JSX 转换原理与 GSR 实现解析
前端·react.js
苏打水com1 小时前
字节跳动前端业务:从「短视频交互」到「全球化适配」的技术挑战
前端·音视频
又是忙碌的一天1 小时前
前端学习 JavaScript
前端·javascript·学习
Jagger_1 小时前
Cursor + Apifox MCP:告别手动复制接口,AI 助你高效完成接口文档开发
前端
IT_陈寒2 小时前
Redis性能优化:5个被低估的配置项让你的QPS提升50%
前端·人工智能·后端