index.vue 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. <template v-if="item.slotName">
  26. <slot :name="item.slotName" :item="item"></slot>
  27. </template>
  28. </div>
  29. </v-col>
  30. </template>
  31. </v-row>
  32. </div>
  33. <slot></slot>
  34. </v-form>
  35. </template>
  36. <script setup>
  37. defineOptions({ name:'components-ct-form'})
  38. import textUI from './../FormUI/TextInput'
  39. import autocompleteUI from './../FormUI/autocomplete'
  40. import { ref, defineEmits } from 'vue'
  41. const emit = defineEmits(['change', 'inputUpdateAutocomplete'])// 定义一个或多个自定义事件
  42. const props = defineProps({items: Object})
  43. const valid = ref(false)
  44. const isValid = ref(true)
  45. const formRef = ref()
  46. const handleChange = (item) => {
  47. // console.log('handleChange', item)
  48. if (item.type === 'date' && item.value) item.option.validate = false
  49. if (item?.change) item.change(item.value, item)
  50. emit('change', false)
  51. }
  52. const validateTime = () => {
  53. isValid.value = true
  54. props.items.options.forEach((e) => {
  55. if (e.type !== 'date' || e.hide || !e.rules) return
  56. const rules = e.rules[0]
  57. const check = rules(e.value)
  58. if (typeof check === 'string') {
  59. isValid.value = false
  60. e.option.error = true
  61. e.option.errorMsg = check
  62. } else {
  63. e.option.error = false
  64. e.option.errorMsg = null
  65. }
  66. })
  67. }
  68. const validate = () => {
  69. const form = formRef.value.validate()
  70. const time = validateTime()
  71. return form && time
  72. }
  73. defineExpose({
  74. validate
  75. })
  76. </script>
  77. <style lang="scss" scoped>
  78. .position {
  79. position: relative;
  80. }
  81. .label {
  82. font-size: 14px;
  83. color: rgba(0, 0, 0, .6);
  84. }
  85. </style>