DynamicFormRoot.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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" v-bind="props" />
  30. </template>
  31. <template #arrayButtons="props">
  32. <slot name="formArrayButtons" v-bind="props" />
  33. </template>
  34. <template #formCeil="values">
  35. <slot name="formCeil" v-bind="values" />
  36. </template>
  37. </DynamicFormItemContainer>
  38. <slot name="endButton" />
  39. </template>
  40. </template>
  41. <script lang="ts" setup>
  42. import { computed, inject, type PropType } from 'vue';
  43. import DynamicFormItemContainer from './DynamicFormItemContainer.vue';
  44. import type { IDynamicFormObject, IDynamicFormOptions } from '..';
  45. import Alert from '@/components/feedback/Alert.vue';
  46. /**
  47. * 动态表单组件。
  48. */
  49. const props = defineProps({
  50. model: {
  51. type: Object as PropType<IDynamicFormObject>,
  52. default: null
  53. },
  54. options: {
  55. type: Object as PropType<IDynamicFormOptions>,
  56. default: null
  57. },
  58. name: {
  59. type: String,
  60. default: ''
  61. }
  62. });
  63. const finalModel = computed(() => {
  64. if (typeof props.model !== 'object')
  65. return {};
  66. return props.model;
  67. });
  68. </script>