当前位置:   article > 正文

在Vue2.0中集成Vform动态表单_vform表单设计器

vform表单设计器

目录

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

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文件中引入组件,并注册组件

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

 三、注册路由

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

  1. {
  2. path: 'VFormDesigner',
  3. name: 'VFormDesigner',
  4. component: () => import('../components/from/VFormDesigner.vue'),
  5. },
  6. {
  7. path: 'VFormRender',
  8. name: 'VFormRender',
  9. component: () => import('../components/from/VFormRender.vue'),
  10. },

1、引入VFormDesigner 设计器

  1. <template>
  2. <div id="app">
  3. <v-form-designer ref="vfDesigner" :field-list-api="fieldListApi" :banned-widgets="testBanned"
  4. :designer-config="designerConfig">
  5. <!-- 自定义按钮插槽演示 -->
  6. <template #customToolButtons>
  7. <el-button type="text" @click="saveFormJson"><i class="el-icon-finished" />保存</el-button>
  8. </template>
  9. </v-form-designer>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'App',
  15. data() {
  16. return {
  17. fieldListApi: {
  18. URL: 'https://www.fastmock.site/mock/2de212e0dc4b8e0885fea44ab9f2e1d0/vform/listField',
  19. labelKey: 'fieldLabel',
  20. nameKey: 'fieldName'
  21. },
  22. testBanned: [
  23. //'sub-form',
  24. //'alert',
  25. ],
  26. designerConfig: {
  27. languageMenu: true,
  28. //externalLink: false,
  29. //formTemplates: false,
  30. //eventCollapse: false,
  31. //clearDesignerButton: false,
  32. //previewFormButton: false,
  33. //presetCssCode: '.abc { font-size: 16px; }',
  34. }
  35. }
  36. },
  37. methods: {
  38. saveFormJson() {
  39. let formJson = this.$refs.vfDesigner.getFormJson()
  40. //TODO: 将formJson提交给后端保存接口,需自行实现!!
  41. this.$message.success('表单已保存!')
  42. },
  43. }
  44. }
  45. </script>
  46. <style lang="scss">
  47. #app {
  48. height: 100%;
  49. }
  50. </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>子组件来渲染页面

  1. <template>
  2. <div>
  3. <v-form-render
  4. :form-json="formJson"
  5. :form-data="formData"
  6. :option-data="optionData"
  7. ref="vFormRef"
  8. >
  9. </v-form-render>
  10. <el-button type="primary" @click="submitForm">提交表单</el-button>
  11. </div>
  12. </template>
  13. <script>
  14. import axios from 'axios'
  15. export default {
  16. data() {
  17. return {
  18. 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":""}},
  19. formData: {},
  20. optionData: {}
  21. }
  22. },
  23. mounted() {
  24. //从后端接口获取表单的选项数据(如表单中无选项类型字段、则跳过此步骤),并赋值给optionData变量,需自行实现!!
  25. axios.get(SERVER_URL + '/get-option-data').then(res => {
  26. if (res.code == 200) {
  27. this.optionData = res.data
  28. }
  29. //从后端接口获取已保存的数据对象(如只显示空白表单、则跳过此步骤),并赋值给formData变量,需自行实现!!
  30. axios.get(SERVER_URL + '/get-form-data').then(res => {
  31. let newFormData = null
  32. if (res.code == 200) {
  33. newFormData = res.data
  34. }
  35. //从后端接口获取表单json对象,然后调用v-form-render对象的setFormJson(xxx)加载表单,需自行实现!!
  36. axios.get(SERVER_URL + '/get-form-json').then(res => {
  37. if (res.code == 200) {
  38. this.$refs.vFormRef.setFormJson(res.data)
  39. this.$nextTick(() => {
  40. this.$refs.vFormRef.setFormData(newFormData)
  41. })
  42. }
  43. }).catch(err => {
  44. //
  45. })
  46. }).catch(err => {
  47. //
  48. })
  49. }).catch(err => {
  50. //
  51. })
  52. },
  53. methods: {
  54. submitForm() {
  55. this.$refs.vFormRef.getFormData().then(formData => {
  56. // Form Validation OK
  57. alert( JSON.stringify(formData) )
  58. }).catch(error => {
  59. // Form Validation failed
  60. this.$message.error(error)
  61. })
  62. }
  63. }
  64. }
  65. </script>
  66. <style scoped>
  67. </style>

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

2.1 渲染器必备默认参数
  1. :form-json="formJson" // 表单对象JSON(表单结构)
  2. :form-data="formData" // 表单数据对象(表单数据)
  3. :option-data="optionData" //表单radio、checkbox、select、cascader组件的选择项集合(默认选中项)
  4. ref="vFormRef" // 用来获取vForm对象

五、vForm的使用思路 

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

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/115449?site
推荐阅读
相关标签
  

闽ICP备14008679号