render.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <template>
  2. <div class="">
  3. <v-form-render ref="vFormRef" :form-json="formJson" :form-data="formData" />
  4. </div>
  5. </template>
  6. <!-- 动态表单渲染 -->
  7. <script setup name="Render" lang="ts">
  8. interface Props {
  9. formJson: string | object;
  10. formData: string | object;
  11. isView: boolean;
  12. }
  13. const props = withDefaults(defineProps<Props>(), {
  14. formJson: '',
  15. formData: '',
  16. isView: false
  17. });
  18. const vFormRef = ref();
  19. // 获取表单数据-异步
  20. const getFormData = () => {
  21. return vFormRef.value.getFormData();
  22. };
  23. /**
  24. * 设置表单内容
  25. * @param {表单配置} formConf
  26. * formConfig:{ formTemplate:表单模板,formData:表单数据,hiddenField:需要隐藏的字段字符串集合,disabledField:需要禁用的自读字符串集合}
  27. */
  28. const initForm = (formConf: any) => {
  29. const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf);
  30. if (formTemplate) {
  31. vFormRef.value.setFormJson(formTemplate);
  32. if (formData) {
  33. vFormRef.value.setFormData(formData);
  34. }
  35. if (disabledField && disabledField.length > 0) {
  36. setTimeout(() => {
  37. vFormRef.value.disableWidgets(disabledField);
  38. }, 200);
  39. }
  40. if (hiddenField && hiddenField.length > 0) {
  41. setTimeout(() => {
  42. vFormRef.value.hideWidgets(hiddenField);
  43. }, 200);
  44. }
  45. if (props.isView) {
  46. setTimeout(() => {
  47. vFormRef.value.disableForm();
  48. }, 100);
  49. }
  50. }
  51. };
  52. defineExpose({ getFormData, initForm });
  53. </script>