SimpleListDynamicForm.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <a-row :gutter="gutter">
  3. <a-col :span="span" v-for="(item, key) in items" :key="key">
  4. <div class="d-flex flex-row">
  5. <div class="flex-grow-1">
  6. <a-form-item v-if="item.type=='text'" :label="item.label" :labelCol="labelCol" :wrapperCol="wrapperCol" :name="item.name||item.key">
  7. <a-input
  8. :required="item.required"
  9. v-model:value="item.value"
  10. :placeholder="item.placeholder||''"
  11. :addon-before="item.prefix"
  12. :addon-after="item.suffix"
  13. :max-length="item.appenderParams?(item.appenderParams.maxLength):undefined"
  14. />
  15. </a-form-item>
  16. <a-form-item v-else-if="item.type=='number'" :label="item.label" :labelCol="labelCol" :wrapperCol="wrapperCol" :name="item.name||item.key">
  17. <a-input-number
  18. :required="item.required"
  19. v-model:value="item.value"
  20. :style="item.suffix&&item.suffix!=''?'':'width: 100%;'"
  21. :min="item.appenderParams?(item.appenderParams.min):undefined"
  22. :max="item.appenderParams?(item.appenderParams.max):undefined"
  23. :step="item.appenderParams?(item.appenderParams.step):undefined"
  24. />
  25. <span v-if="item.suffix&&item.suffix!=''" class="ml-2">{{item.suffix}}</span>
  26. </a-form-item>
  27. <a-form-item v-if="item.type=='checkbox'" :label="item.label" :labelCol="labelCol" :wrapperCol="wrapperCol" :name="item.name||item.key">
  28. <a-checkbox v-model:checked="item.value">{{item.label}}</a-checkbox>
  29. </a-form-item>
  30. <a-form-item v-else-if="item.type=='text-array'" :label="item.label" :labelCol="labelCol" :wrapperCol="wrapperCol" :name="item.name||item.key">
  31. <SimpleEditDynamicStringList
  32. :array="(item.value as string[])"
  33. placeholder="请输入参数值"
  34. />
  35. </a-form-item>
  36. <a-form-item v-else-if="item.type=='text-select'" :label="item.label" :labelCol="labelCol" :wrapperCol="wrapperCol" :name="item.name||item.key">
  37. <a-select
  38. :required="item.required"
  39. v-model:value="item.value"
  40. style="width: 100%"
  41. :options="item.appenderParams?.options"
  42. >
  43. </a-select>
  44. </a-form-item>
  45. </div>
  46. <a-popconfirm
  47. v-if="canDelete"
  48. title="确定删除此参数吗?"
  49. @confirm="$emit('delete', item, key)"
  50. >
  51. <a-button class="ml-3">
  52. <template #icon><DeleteOutlined /></template>
  53. </a-button>
  54. </a-popconfirm>
  55. </div>
  56. </a-col>
  57. </a-row>
  58. </template>
  59. <script lang="ts">
  60. import { defineComponent, type PropType } from 'vue'
  61. import { DeleteOutlined } from '@ant-design/icons-vue'
  62. import SimpleEditDynamicStringList from './SimpleEditDynamicStringList.vue';
  63. export interface SimpleListDynamicFormItem {
  64. label: string;
  65. value: unknown;
  66. name: string;
  67. key: string;
  68. required?: boolean,
  69. type: 'text'|'number'|'checkbox'|'radio'|'switch'|'text-array'|'text-select';
  70. placeholder ?: string;
  71. prefix ?: string;
  72. suffix ?: string;
  73. appenderParams ?: {
  74. [index: string]: unknown
  75. };
  76. }
  77. /**
  78. * 简单的列表动态表单
  79. */
  80. export default defineComponent({
  81. name: 'SimpleListDynamicForm',
  82. components: {
  83. SimpleEditDynamicStringList,
  84. DeleteOutlined,
  85. },
  86. props: {
  87. /**
  88. * 表单条目
  89. */
  90. items: {
  91. required: true,
  92. type: Object as PropType<SimpleListDynamicFormItem[]>
  93. },
  94. /**
  95. * 是否可以删除表单条目
  96. */
  97. canDelete: {
  98. default: true,
  99. type: Boolean
  100. },
  101. span: {
  102. default: 7,
  103. type: Number
  104. },
  105. gutter: {
  106. default: 30,
  107. },
  108. labelCol: {
  109. default: () => { return { span: 10 } },
  110. type: Object
  111. },
  112. wrapperCol: {
  113. default: () => { return { span: 14 } },
  114. type: Object
  115. },
  116. /**
  117. * 是否显示删除按钮
  118. */
  119. showDelete: {
  120. default: false,
  121. type: Boolean
  122. },
  123. },
  124. })
  125. </script>