DynamicFormRoot.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <!-- eslint-disable vue/no-mutating-props -->
  2. <template>
  3. <!--空显示-->
  4. <slot name="empty" v-if="options.formItems?.length == 0 || !model">
  5. <div v-if="options.emptyText" class="dynamic-form-item-empty">{{ options.emptyText }}</div>
  6. </slot>
  7. <Alert
  8. v-else-if="(typeof model !== 'object' && !options.suppressRootError)"
  9. type="warning"
  10. message="DynamicForm: model is not a object!"
  11. :description="`At form ${name || 'unnamed'} Root`"
  12. />
  13. <template v-else>
  14. <!--表单条目渲染核心-->
  15. <DynamicFormItemContainer
  16. v-for="(item, index) in options.formItems"
  17. :key="index"
  18. :item="item"
  19. :name="item.name"
  20. :rawModel="finalModel"
  21. :model="finalModel[item.name]"
  22. :parentModel="finalModel"
  23. :isFirst="index === 0"
  24. :isLast="index === options.formItems.length - 1"
  25. @update:model="(v: unknown) => finalModel[item.name] = v"
  26. :disabled="options.disabled"
  27. >
  28. <template #arrayButtonAdd="props">
  29. <slot name="formArrayButtonAdd" :onClick="props.onClick" />
  30. </template>
  31. <template #arrayButtons="props">
  32. <slot name="formArrayButtons"
  33. :onDeleteClick="props.onDeleteClick"
  34. :onUpClick="props.onUpClick"
  35. :onDownClick="props.onDownClick"
  36. />
  37. </template>
  38. <template #formCeil="{ data }">
  39. <slot name="formCeil"
  40. :name="data.name"
  41. :item="data.item"
  42. :model="data.model"
  43. :onModelUpdate="data.onModelUpdate"
  44. :rawModel="data.rawModel"
  45. :parentModel="data.parentModel"
  46. :parent="data.parent"
  47. :rules="data.item.rules"
  48. :disabled="data.disabled"
  49. :additionalProps="data.additionalProps"
  50. />
  51. </template>
  52. </DynamicFormItemContainer>
  53. <slot name="endButton" />
  54. </template>
  55. </template>
  56. <script lang="ts" setup>
  57. import { computed, inject, type PropType } from 'vue';
  58. import DynamicFormItemContainer from './DynamicFormItemContainer.vue';
  59. import type { IDynamicFormObject, IDynamicFormOptions } from '..';
  60. import Alert from '@/components/feedback/Alert.vue';
  61. /**
  62. * 动态表单组件。
  63. */
  64. const props = defineProps({
  65. model: {
  66. type: Object as PropType<IDynamicFormObject>,
  67. default: null
  68. },
  69. options: {
  70. type: Object as PropType<IDynamicFormOptions>,
  71. default: null
  72. },
  73. name: {
  74. type: String,
  75. default: ''
  76. }
  77. });
  78. const finalModel = computed(() => {
  79. if (typeof props.model !== 'object')
  80. return {};
  81. return props.model;
  82. });
  83. </script>