保存表单对象

实现思路:

  1. 配置v-form-designer的customToolButtons插槽,新增一个“保存”按钮;
  2. 新增一个saveFormJson()方法,通过ref调用getFormJson()方法获取表单json对象,并提交给后台接口;
  3. 点击“保存”按钮时,调用上述saveFormJson()方法;
  4. 收工。

完整代码如下所示:

  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">保存</el-button>
  8. </template>
  9. </v-form-designer>
  10. </div>
  11. </template>
  12. <script setup>
  13. import { ref, reactive } from 'vue'
  14. import { ElMessage } from 'element-plus'
  15. const vfDesigner = ref(null)
  16. const fieldListApi = reactive({
  17. URL: 'https://www.fastmock.site/mock/2de212e0dc4b8e0885fea44ab9f2e1d0/vform/listField',
  18. labelKey: 'fieldLabel',
  19. nameKey: 'fieldName'
  20. })
  21. const testBanned = ref([
  22. //'sub-form',
  23. //'alert',
  24. ])
  25. const designerConfig = reactive({
  26. languageMenu: true,
  27. //externalLink: false,
  28. //formTemplates: false,
  29. //eventCollapse: false,
  30. //clearDesignerButton: false,
  31. //previewFormButton: false,
  32. //presetCssCode: '.abc { font-size: 16px; }',
  33. })
  34. const saveFormJson = () => {
  35. let formJson = vfDesigner.value.getFormJson()
  36. //TODO: 将formJson提交给后端保存接口,需自行实现!!
  37. ElMessage.success('表单已保存!')
  38. }
  39. </script>
  40. <style lang="scss">
  41. #app {
  42. height: 100%;
  43. }
  44. </style>

渲染表单

实现思路:

  1. 如表单中有保存于后端的选项数据(对应radio、check、select、cascader四类组件),从后端接口获取后赋值给v-form-render的option-data属性(可参见选项数据加载);
  2. 如表单需要显示后端已保存的数据对象,从后端接口获取后赋值给v-form-render的form-data属性,如只需显示空白表单,则form-data属性可传入空对象{};
  3. 从后端接口获取表单json对象fjson,调用v-form-render对象的setFormJson(fjson)方法加载表单;
  4. 上述3步,应在mounted事件钩子中完成。如表单在对话框中显示,则以上3步,应在对话框显示之前完成;
  5. 完工。

完整代码如下所示:

  1. <template>
  2. <div>
  3. <v-form-render :form-json="formJson" :form-data="formData" :option-data="optionData" ref="vFormRef">
  4. </v-form-render>
  5. <el-button type="primary" @click="submitForm">提交表单</el-button>
  6. </div>
  7. </template>
  8. <script setup>
  9. import { ref, reactive, onMounted } from 'vue'
  10. import { ElMessage } from 'element-plus'
  11. import axios from 'axios'
  12. const vFormRef = ref(null)
  13. const formJson = reactive({"widgetList":[],"formConfig":{"modelName":"formData","refName":"vForm","rulesName":"rules","labelWidth":80,"labelPosition":"left","size":"","labelAlign":"label-left-align","cssCode":"","customClass":"","functions":"","layoutType":"PC","jsonVersion": 3,"onFormCreated":"","onFormMounted":"","onFormDataChange":"","onFormValidate":""}})
  14. const formData = reactive({})
  15. const optionData = reactive({})
  16. const submitForm = () => {
  17. vFormRef.value.getFormData().then(formData => {
  18. // Form Validation OK
  19. alert( JSON.stringify(formData) )
  20. }).catch(error => {
  21. // Form Validation failed
  22. ElMessage.error(error)
  23. })
  24. }
  25. onMounted(() => {
  26. //从后端接口获取表单的选项数据(如表单中无选项类型字段、则跳过此步骤),并赋值给optionData变量,需自行实现!!
  27. axios.get(SERVER_URL + '/get-option-data').then(res => {
  28. if (res.code == 200) {
  29. optionData = res.data
  30. }
  31. //从后端接口获取已保存的数据对象(如只显示空白表单、则跳过此步骤),并赋值给formData变量,需自行实现!!
  32. axios.get(SERVER_URL + '/get-form-data').then(res => {
  33. let newFormData = null
  34. if (res.code == 200) {
  35. newFormData = res.data
  36. }
  37. //从后端接口获取表单json对象,然后调用v-form-render对象的setFormJson(xxx)加载表单,需自行实现!!
  38. axios.get(SERVER_URL + '/get-form-json').then(res => {
  39. if (res.code == 200) {
  40. vFormRef.value.setFormJson(res.data)
  41. this.$nextTick(() => {
  42. vFormRef.value.setFormData(newFormData)
  43. })
  44. }
  45. }).catch(err => {
  46. //
  47. })
  48. }).catch(err => {
  49. //
  50. })
  51. }).catch(err => {
  52. //
  53. })
  54. })
  55. </script>
  56. <style lang="scss" scoped>
  57. </style>