index.vue 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <v-form ref="formRef" v-model="valid" class="login-form" @submit.prevent>
  3. <div>
  4. <v-row dense no-gutters class="justify-space-between">
  5. <template v-for="(item) in props.items.options">
  6. <slot :name="item.prevSlot"></slot>
  7. <v-col :key="item.key" v-if="!item.hide" :cols="item.col || '12'" class="position">
  8. <template v-if="item.slotTitle">
  9. <div :class="item.class" :style="item.slotTitleStyle">{{ item.slotTitle }}</div>
  10. </template>
  11. <div class="d-flex" :class="item.flexStyle || 'flex-row'">
  12. <!-- <span>{{ item.value }}</span> -->
  13. <textUI
  14. v-if="['text', 'password', 'number'].includes(item.type)"
  15. v-model="item.value"
  16. :item="item"
  17. @change="handleChange(item)"
  18. ></textUI>
  19. <autocompleteUI
  20. v-if="item.type === 'autocomplete'"
  21. v-model="item.value"
  22. :item="item"
  23. @change="handleChange(item)"
  24. ></autocompleteUI>
  25. <radioGroupUI
  26. v-if="item.type === 'ifRadio'"
  27. v-model="item.value"
  28. :item="item"
  29. @change="handleChange(item)"
  30. ></radioGroupUI>
  31. <template v-if="item.slotName">
  32. <slot :name="item.slotName" :item="item"></slot>
  33. </template>
  34. </div>
  35. </v-col>
  36. </template>
  37. </v-row>
  38. </div>
  39. <slot></slot>
  40. </v-form>
  41. </template>
  42. <script setup>
  43. defineOptions({ name:'components-ct-form'})
  44. import textUI from './../FormUI/TextInput'
  45. import autocompleteUI from './../FormUI/autocomplete'
  46. import radioGroupUI from './../FormUI/radioGroup'
  47. import { ref, defineEmits } from 'vue'
  48. const emit = defineEmits(['change', 'inputUpdateAutocomplete'])// 定义一个或多个自定义事件
  49. const props = defineProps({items: Object})
  50. const valid = ref(false)
  51. const isValid = ref(true)
  52. const formRef = ref()
  53. const handleChange = (item) => {
  54. // console.log('handleChange', item)
  55. if (item.type === 'date' && item.value) item.option.validate = false
  56. if (item?.change) item.change(item.value, item)
  57. emit('change', false)
  58. }
  59. const validateTime = () => {
  60. isValid.value = true
  61. props.items.options.forEach((e) => {
  62. if (e.type !== 'date' || e.hide || !e.rules) return
  63. const rules = e.rules[0]
  64. const check = rules(e.value)
  65. if (typeof check === 'string') {
  66. isValid.value = false
  67. e.option.error = true
  68. e.option.errorMsg = check
  69. } else {
  70. e.option.error = false
  71. e.option.errorMsg = null
  72. }
  73. })
  74. }
  75. const validate = () => {
  76. const form = formRef.value.validate()
  77. const time = validateTime()
  78. return form && time
  79. }
  80. defineExpose({
  81. validate
  82. })
  83. </script>
  84. <style lang="scss" scoped>
  85. .position {
  86. position: relative;
  87. }
  88. .label {
  89. font-size: 14px;
  90. color: rgba(0, 0, 0, .6);
  91. }
  92. </style>