在Vue2.0中集成Vform动态表单

news2024/12/23 17:53:56

目录

一、打包下载源码,引入组件

1、项目地址   

2、下载并打包

二、将vform集成到项目中

1、导入v-form-designer、v-form-render两个组件

 2、在项目的main.js文件中引入组件,并注册组件

三、注册路由

1、引入VFormDesigner 设计器

2、使用VFormDesigner 设计器报错解决及注意事项

2.1 报错及解决:

2.2 注意事项

四、渲染表单

1、引入VFormRender 渲染器

 2、使用VFormRender 渲染器的注意事项

2.1 渲染器必备默认参数

五、vForm的使用思路 

        最近由于业务需要,要做一个导出类似Word登记表的功能,所以考虑使用Variant Form动态表单来做前端表单的搭建、表单交互以及数据收集等功能。

        Variant Form实际上是一个低代码表单,支持Element UI组件库,能够大大提高我们的开发效率以及用户体验,这也是我们选择这一组件的目的。

        我们这次的功能涉及:Variant Form表单的引入、使用以及导出Word文档,我将全程记录使用过程中遇到的问题以及难点。

一、打包下载源码,引入组件

        Variant Form采用的是本地引入的方式,通过拉取GitHub的项目包,打包后生成两个本地文件,然后引入我们的项目中使用。

注意:Variant Form是依赖于Element UI的,所以项目中必须有Element UI框架。

1、项目地址   

GitHub - vform666/variant-form: A powerful form designer for Vue.A powerful form designer for Vue. Contribute to vform666/variant-form development by creating an account on GitHub.https://github.com/vform666/variant-form

2、下载并打包

下载依赖:yarn 

编译打包:yarn run lib

二、将vform集成到项目中

1、导入v-form-designer、v-form-render两个组件

        (1)执行完上一步之后,要在项目的dist/lib目录下找到下下面这两个文件

        (2)在项目根目录下新建lib/vform文件夹,将上述两个文件放进去

 2、在项目的main.js文件中引入组件,并注册组件

import vform from '../lib/vform/VFormDesigner.umd.min.js'
import '../lib/vform/VFormDesigner.css'
Vue.use(vform) //同时注册了v-form-designer、v-form-render等组件

 三、注册路由

        需要注意的是:VForm分为VFormDesigner(设计器)和VFormRender(渲染器),要同时为这两个都注册路由

{
    path: 'VFormDesigner',
    name: 'VFormDesigner',
    component: () => import('../components/from/VFormDesigner.vue'),
},
{
    path: 'VFormRender',
    name: 'VFormRender',
    component: () => import('../components/from/VFormRender.vue'),
},

1、引入VFormDesigner 设计器

<template>
  <div id="app">
    <v-form-designer ref="vfDesigner" :field-list-api="fieldListApi" :banned-widgets="testBanned"
                   :designer-config="designerConfig">
      <!-- 自定义按钮插槽演示 -->
      <template #customToolButtons>
        <el-button type="text" @click="saveFormJson"><i class="el-icon-finished" />保存</el-button>
      </template>
    </v-form-designer>

  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      fieldListApi: {
        URL: 'https://www.fastmock.site/mock/2de212e0dc4b8e0885fea44ab9f2e1d0/vform/listField',
        labelKey: 'fieldLabel',
        nameKey: 'fieldName'
      },

      testBanned: [
        //'sub-form',
        //'alert',
      ],

      designerConfig: {
        languageMenu: true,
        //externalLink: false,
        //formTemplates: false,
        //eventCollapse: false,
        //clearDesignerButton: false,
        //previewFormButton: false,

        //presetCssCode: '.abc { font-size: 16px; }',
      }
    }
  },
  methods: {
    saveFormJson() {
      let formJson = this.$refs.vfDesigner.getFormJson()
      //TODO: 将formJson提交给后端保存接口,需自行实现!!
      this.$message.success('表单已保存!')
    },

  }
}
</script>

<style lang="scss">
  #app {
    height: 100%;
  }
</style>

2、使用VFormDesigner 设计器报错解决及注意事项

2.1 报错及解决:

        引入lib文件后可能会出现一系列报错,原因就是lib文件中没有遵守eslint配置,所以需要忽略这里面的两个文件

解决方案:

 (1) babel设置忽略lib目录,可以修改Vue项目的babel.config.js文件,如下所示:

(2) eslint设置忽略lib目录,在Vue项目根目录下新建.eslintignore文件,如下所示:

(3) 修改完成后重启项目

2.2 注意事项

(1)设计器页面的log、语言切换菜单等都是可以通过designer-config属性配置显示或隐藏的,具体看下面文档(在data中直接用):

8.1表单组件 · 语雀表单设计器——VFormDesigner属性(prop...https://www.yuque.com/visualdev/vform/nhhusr

(2)在设计器右上角有一个“保存”按钮,是用来保存表单结构的,但是由于页面宽高的问题,经常会被遮挡住,需要自己用css将它显示出来(至关重要)。

四、渲染表单

1、引入VFormRender 渲染器

        渲染器实际上就是我们页面显示的内容,通过引入<v-form-render></v-form-render>子组件来渲染页面

<template>
  <div>
    <v-form-render
      :form-json="formJson"
      :form-data="formData"
      :option-data="optionData"
      ref="vFormRef"
    >
    </v-form-render>
    <el-button type="primary" @click="submitForm">提交表单</el-button>
  </div>
</template>

<script>
  import axios from 'axios'
  
  export default {
    data() {
      return {
        formJson: {"widgetList":[],"formConfig":{"modelName":"formData","refName":"vForm","rulesName":"rules","labelWidth":80,"labelPosition":"left","size":"","labelAlign":"label-left-align","cssCode":"","customClass":"","functions":"","layoutType":"PC","onFormCreated":"","onFormMounted":"","onFormDataChange":"","onFormValidate":""}},
        formData: {},
        optionData: {}
      }
    },

    mounted() {
      //从后端接口获取表单的选项数据(如表单中无选项类型字段、则跳过此步骤),并赋值给optionData变量,需自行实现!!
      axios.get(SERVER_URL + '/get-option-data').then(res => {
        if (res.code == 200) {
          this.optionData = res.data
        }
        
        //从后端接口获取已保存的数据对象(如只显示空白表单、则跳过此步骤),并赋值给formData变量,需自行实现!!
        axios.get(SERVER_URL + '/get-form-data').then(res => {
          let newFormData = null
          if (res.code == 200) {
            newFormData = res.data
          }
          
          //从后端接口获取表单json对象,然后调用v-form-render对象的setFormJson(xxx)加载表单,需自行实现!!
          axios.get(SERVER_URL + '/get-form-json').then(res => {
            if (res.code == 200) {
              this.$refs.vFormRef.setFormJson(res.data)
              this.$nextTick(() => {
                this.$refs.vFormRef.setFormData(newFormData)
              })
            }
          }).catch(err => {
            //
          })
        }).catch(err => {
          //
        })
      }).catch(err => {
        //
      })
    },

    methods: {
      submitForm() {
        this.$refs.vFormRef.getFormData().then(formData => {
          // Form Validation OK
          alert( JSON.stringify(formData) )
        }).catch(error => {
          // Form Validation failed
          this.$message.error(error)
        })
      }
    }
  }
</script>

<style scoped>

</style>

 2、使用VFormRender 渲染器的注意事项

2.1 渲染器必备默认参数

:form-json="formJson"  // 表单对象JSON(表单结构)
:form-data="formData"  // 表单数据对象(表单数据)
:option-data="optionData"  //表单radio、checkbox、select、cascader组件的选择项集合(默认选中项)
ref="vFormRef"  // 用来获取vForm对象

五、vForm的使用思路 

        (1)设计:首先在设计器中编辑好表单结构,点击“保存”后,会将设计好的表单结构以及表单配置保存到formJson对象中(在官方文档中还有更加具体的表单对象),可以找找你所需要的,然后将这个值转成JSON后存到数据库即可

 

        (2)渲染:当页面上需要用到动态表达表单时,通过引入<v-form-render></v-form-render>子组件并且配置好必备参数,就能够将动态表单渲染到页面中。要注意的是动态表单的加载需要在页面加载完成后才能渲染数据,所以一定要保证在页面加载完成后再去渲染!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Azure Kinect DK + ROS1 Noetic使用教程

作者&#xff1a; Herman Ye Galbot Auromix 版本&#xff1a; V1.0 测试环境&#xff1a; Ubuntu20.04 更新日期&#xff1a; 2023/08/08 注1&#xff1a; 本文内容中的硬件由 Galbot 提供支持。 注2&#xff1a; Auromix 是一个机器人爱好者开源组织。 注3&#xff1a; 本文在…

Ajax同源策略及跨域问题

Ajax同源策略及跨域问题 同源策略ajax跨域问题什么是跨域&#xff1f;为什么不允许跨域&#xff1f;跨域解决方案1、CORS2、express自带的中间件cors3、JSONP原生JSONPjQuery发送JSONP 4、使用vscode的Live Server插件 同源策略 同源策略&#xff08;Same-Origin Policy&#…

Mybatis-plus实现【真·批量插入】

Mybatis基本是现在最为常用的ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;进行普通的CRUD非常方便。 一. BaseMapper 实体类对应的mapper在继承BaseMapper后&#xff0c;就可以使用以下Mybatis-plus提供的方法进行数据操作…

3个月快速入门LoRa物联网传感器开发

在这里插入图片描述 快速入门LoRa物联网传感器开发 LoRa作为一种LPWAN(低功耗广域网络)无线通信技术,非常适合物联网传感器和行业应用。要快速掌握LoRa开发,需要系统学习理论知识,并通过实际项目积累经验。 摘要: 先学习LoRa基础知识:原理、网络架构、协议等,大概需要2周时间…

高德地图 SDK 接口测试接入(AndroidTest 上手)

学习资料 官方文档 在 Android 平台上测试应用 | Android 开发者 | Android Developers 测试了解 【玩转Test】开篇-Android test 介绍 Android单元测试全解_android 单元测试_一代小强的博客-CSDN博客 Android单元测试-对Activity的测试_activitytestrule_许佳佳233的博客…

SpringMVC的架构有什么优势?——异常处理与文件上传(五)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

PHP8定义字符串的方法-PHP8知识详解

字符串&#xff0c;顾名思义&#xff0c;就是将一堆字符串联在一起。字符串简单的定义方法是使用英文单引号&#xff08; &#xff09;或英文双引号&#xff08;" "&#xff09;包含字符。另外&#xff0c;还可以使用定界符定义字符串。本文还介绍了字符串的连接符。…

脑动极光冲刺上市:盈利能力存疑,永泰生物董事长谭铮为控股股东

8月8日&#xff0c;脑动极光医疗科技有限公司&#xff08;下称“脑动极光”&#xff09;向港交所递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中金公司和浦银国际为其保荐机构。脑动极光在招股书中表示&#xff0c;其是一家根据上市规则18A寻求在港交所上市的生物科…

【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

重发布选路问题

一、思路 &#xff1b; 1.增加不优选路开销解决选路不佳问题 2.用增加开销的方式使R1 不将ASBR传的R7传给另一台ASBR解决R1、R2、R3、R4pingR7环回环路 二、操作 ------IP地址配置如图 1.ospf及rip的宣告 rip&#xff1a; [r1]rip 1 [r1-rip-1]version 2 [r1-rip-1]netw…

【android】mac mini m2安装android studio

文章目录 一、环境搭建1.1 安装路径1.2 mac arm1.3 安装android studio 二、安装sdk三、更新sdk3.1 关闭代理3.2 重新更新sdk 四、更新api五、项目创建六、gradle安装七、avd八、问题&#xff1a;build tools缺失九、编译运行小结 一、环境搭建 1.1 安装路径 windows&#xf…

HTML5 中新增了哪些表单元素?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML5 中新增了的表单元素⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

大数据培训课程-《机器学习从入门到精通》上新啦

《机器学习从入门到精通》课程是一门专业课程&#xff0c;面向人工智能技术服务&#xff0c;课程系统地介绍了Python编程库、分类、回归、无监督学习和模型使用技巧以及算法和案例充分融合。 《机器学习从入门到精通》课程亮点&#xff1a; 课程以任务为导向&#xff0c;逐步学…

linux之find命令

概览 Linux下find命令在目录结构中搜索文件&#xff0c;并执行指定的操作。Linux下find命令提供了相当多的查找条件&#xff0c;功能很强大。由于find具有强大的功能&#xff0c;所以它的选项也很多&#xff0c;其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络…

ESP32 Max30102 (1)检测 心率

1. 运行效果 未检测效果如下 检测效果如下

第九次作业

1. SSL工作过程是什么&#xff1f; 当客户端向一个 https 网站发起请求时&#xff0c;服务器会将 SSL 证书发送给客户端进行校验&#xff0c;SSL 证书中包含一个公钥。校验成功后&#xff0c;客户端会生成一个随机串&#xff0c;并使用受访网站的 SSL 证书公钥进行加密&#xf…

算法基础之插入排序

1、插入排序基本思想 插入排序的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采用in-place排序&#xff08;即只需用到O(1)的额外空间的排序&#xff09;&a…

Mobaxterm 突破 14个 session 限制

mobaxterm 可以说非常好用&#xff0c;但是免费版对会话有限制&#xff0c;对于有很多虚拟机会话需要存储的我来说确实太少了。 超过限制时&#xff0c;提示如下&#xff0c;再新建的 session 将不会被存储&#xff0c;说明下次登陆还需要输入一遍 ip、账号密码。 Mobaxterm 突…

剑指Offer68-I.二叉搜索树的最近公共祖先 C++

1、题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也…

基于Doris实时数据开发的一些注意事项

300万字&#xff01;全网最全大数据学习面试社区等你来&#xff01; 最近Doris的发展大家是有目共睹的。例如冷热分离等新特性的持续增加。使得Doris在易用和成本上都有大幅提升。 基于Doris的一些存储实时数仓在越来越多的场景中开始有一些实践。大家也看到了这种方案频繁出现…