vue根据后端数据生成form表单

vue根据后端数据生成form表单

后端数据格式

 formData: [
        {
          label: '角色名称',
          id: 'name',	 //key值
          type: 'input', //form的属性
          placeholder: '请输入角色名称',
        },
        {
          label: '渠道',
          type: 'select',
          id: 'channel',
          placeholder: '请选择渠道',
          radio: [
            { key: 1, value: '安卓' },
            { key: 2, value: 'IOS' },
          ], // 选项
        },
        {
          label: '时间',
          type: 'datePicker',
          id: 'date',
          placeholder: '请选择时间',
        },
        {
          label: '复选框',
          type: 'checkbox',
          id: 'checkbox',
          placeholder: '请选择',
          checkbox: [
            { key: 1, value: '安卓' },
            { key: 2, value: 'IOS' },
          ],
        },
        {
          label: '单选',
          type: 'radio',
          id: 'radio',
          placeholder: '请选择',
          radio: [
            { key: 1, value: '安卓' },
            { key: 2, value: 'IOS' },
          ],
        },
        {
          label: '文本框',
          type: 'textArea',
          id: 'textArea',
          placeholder: '请输入',
        },
      ],

表单组件

<template>
  <div>
    <a-form-model :model="form" layout="inline">
      <a-row>
        <a-col :span="4" v-for="(item, index) in formData" :key="index">
          <div v-if="item.type == 'input'">
            <a-form-model-item :label="item.label">
              <a-input v-model="form[item.id]" :placeholder="item.placeholder" />
            </a-form-model-item>
          </div>
          <div v-if="item.type == 'select'">
            <a-form-model-item :label="item.label">
              <a-select :placeholder="item.placeholder" v-model="form[item.id]" style="width: 183px">
                <a-select-option v-for="(item, index) in item.radio" :key="item.key + index">
                  {{ item.value }}
                </a-select-option>
              </a-select>
            </a-form-model-item>
          </div>
          <div v-if="item.type == 'datePicker'">
            <a-form-model-item :label="item.label">
              <a-date-picker
                v-model="form[item.id]"
                show-time
                format="YYYY-MM-DD"
                value-format="YYYY-MM-DD "
                :placeholder="item.placeholder"
                style="width: 183px"
              />
            </a-form-model-item>
          </div>
          <div v-if="item.type == 'checkbox'">
            <a-form-model-item :label="item.label">
              <a-checkbox-group :placeholder="item.placeholder" v-model="form[item.id]" style="width: 183px">
                <a-checkbox v-for="(item, index) in item.checkbox" :key="item.key + index" :value="item.value">
                  {{ item.value }}
                </a-checkbox>
              </a-checkbox-group>
            </a-form-model-item>
          </div>
          <div v-if="item.type == 'radio'">
            <a-form-model-item :label="item.label">
              <a-radio-group :placeholder="item.placeholder" v-model="form[item.id]" style="width: 183px">
                <a-radio v-for="(item, index) in item.radio" :key="item.key + index" :value="item.value">
                  {{ item.value }}
                </a-radio>
              </a-radio-group>
            </a-form-model-item>
          </div>
          <div v-if="item.type == 'textArea'">
            <a-form-model-item :label="item.label">
              <a-input
                v-model="form[item.id]"
                :placeholder="item.placeholder"
                type="textarea"
                style="width: 100%; height: 100%"
              />
            </a-form-model-item>
          </div>
        </a-col>
        <slot></slot> // 插槽 特殊需求单独写入
        <a-col :span="4">
          <a-form-model-item>
            <a-button @click="submit" type="primary">查询</a-button>
          </a-form-model-item>
        </a-col>
      </a-row>
    </a-form-model>
  </div>
</template>

<script>
export default {
  name: 'AntdadminIndex',
  props: {
  //接收父组件拿到的表单内容 然后遍历
    formData: {
      type: Array,
      default: [],
    },
  },
  data() {
    return {
      form: {},
    }
  },

  mounted() {},

  methods: {
    submit() {
      console.log(this.form)
      this.$emit('updateValue', this.form)
    },
  },
}
</script>

<style lang="scss" scoped>
</style>

思路很简单 就是挨个去判断每个对象的类型 然后根据类型去渲染出对应的form对象

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
引用\[1\]:Fantastic-admin是一款开箱即用的 Vue 中后台管理系统框架,它提供了丰富的布局与主题,覆盖市面上各种中后台应用场景,兼容PC、平板和移动端。它还提供了系统配置文件,可以轻松实现个性化定制。此外,Fantastic-admin还具有精心设计的动效,根据路由配置自动生成导航栏,支持全方位权限验证等特点。你可以在Github和Gitee上找到它的仓库地址,也可以在预览地址上查看它的基础版和专业版的效果。\[1\] 引用\[2\]:vue3-antd-admin是另一个基于vue-cli5.x/vite2.x + vue3.x + ant-design-vue3.x + typescript hooks 的基础后台管理系统模板。它集成了RBAC的权限系统,提供了JSON Schema动态表单、动态表格、漂亮锁屏界面等功能。你可以在文档地址上查看相关文档,也可以在仓库地址上找到它的代码。预览地址上提供了Gitee和Vercel上的预览效果。\[2\] 引用\[3\]:还有一个使用vue3开发的后台管理系统模板,它的页面简单大方,采用悬浮式的风格,将菜单栏、顶部面包屑、中间操作区域等合理划分。它支持主题颜色自定义,可以一键开启黑色主题,还支持浅色、深色菜单动态切换等功能。它采用动态路由,依托若依后端接口,拥有强大的权限管理功能。如果你对若依感兴趣,可以点击链接了解更多信息。\[3\] 综上所述,有多个vue3后台管理系统模板可供选择,包括Fantastic-admin、vue3-antd-admin和另一个使用vue3开发的模板。它们都提供了丰富的功能和定制化选项,可以根据你的需求选择适合的模板进行开发。 #### 引用[.reference_title] - *1* *2* [开箱即用,这些 Vue3 后台管理系统模板绝对让你爽歪歪!](https://blog.csdn.net/qq_41356250/article/details/126656945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [使用vue3从0开发一个后台管理系统](https://blog.csdn.net/SongZhengxing_/article/details/127573658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值