Vue + iView 动态生成表单组件

1,258 阅读2分钟

原因

在中后台系统中,经常可以遇到多个表单搜索加表格展示的页面。

image.png

这种表单搜索加表格展示,占中后台管理系统页面的50%-80%。虽然有很多优秀的UI组件库,例如 iview,antd,element-ui,但组件较为零散。每次构建需要大量组件拼装代码,单独写一个表单+表格页面我们就需要上百行代码来实现,带来的问题就是维护性较差,bug无法快速精准定位。

针对这种问题,我们现有成熟的框架,XXXAdmin,low code低代码可以解决。但是相结合自身实际业务,发现并不需要整套解决方案,只需要很少一部分即可。

为了提高开发效率,解放生产力,本着DRY(Don't Repeat Yourself )原则 ,我把表单和相关处理逻辑抽离出来,通过 JSON 抽象配置来动态生成表单,vue-form-reactive , 基于vue的响应式表单生成插件。

使用

const formDescriptors = reactive({
  form: {
    ref: 'node',
  },
  item: [ // 表单输入类型字段及校验配置
    {
      type: 'fSelect',
      labelWidth: 120,
      title: 'Select',
      field: 'resource',
      options: [], // 下拉数组
      rule: [{ required: true}],
    },
    {
      type: 'fInput',
      labelWidth: 120,
      title: 'Type',
      field: 'type',
      placeholder: '请输入类型',
      rule: [
        { required: true, message: '请输入类型', trigger: 'blur' },
      ],
    },
    {
      type: 'fInput',
      labelWidth: 120,
      title: 'Title',
      field: 'title',
      placeholder: '请输入标题',
      rule: [
        { required: true, message: '请输入标题', trigger: 'blur' },
      ],
    },
    {
      type: 'fInput',
      labelWidth: 120,
      title: 'Content',
      field: 'content',
      placeholder: '请输入内容',
      rule: [{ validator: validateContent }],
    },
    {
      type: 'fRadio',
      labelWidth: 120,
      title: '性别',
      field: 'handleType',
      group: {},
      radios: [
        {
          label: '男',
          key: '00',
        },
        {
          label: '女',
          key: '01',
          disabled: true,
        },
      ],
    },
  ]

生提交成表单页面

image.png

生成搜索表单页面

image.png

具体用法请查看 vue-form-reactive

优点

  1. 通过 JSON 生成表单
  2. 基于 iview 和 jsx 语法。
  3. 体积小,便于各位拉取之后更改。

感谢

感谢优秀的动态组件库和Y老师。欢迎 star 和 提 issue