index.vue 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <script setup lang="ts">
  2. import type { CalendarProps, FieldProps } from 'vant'
  3. import { pick } from 'lodash-es'
  4. import dayjs from '@/utils/dayjs'
  5. defineOptions({
  6. name: 'VanFieldCalendar',
  7. })
  8. const props = withDefaults(
  9. defineProps<{
  10. // field
  11. label?: FieldProps['label']
  12. name?: FieldProps['name']
  13. id?: FieldProps['id']
  14. size?: FieldProps['size']
  15. placeholder?: FieldProps['placeholder']
  16. border?: FieldProps['border']
  17. colon?: FieldProps['colon']
  18. required?: FieldProps['required']
  19. center?: FieldProps['center']
  20. arrowDirection?: FieldProps['arrowDirection']
  21. labelClass?: FieldProps['labelClass']
  22. labelWidth?: FieldProps['labelWidth']
  23. labelAlign?: FieldProps['labelAlign']
  24. leftIcon?: FieldProps['leftIcon']
  25. rightIcon?: FieldProps['rightIcon']
  26. rules?: FieldProps['rules']
  27. // calendar
  28. color?: CalendarProps['color']
  29. minDate?: CalendarProps['minDate']
  30. maxDate?: CalendarProps['maxDate']
  31. formatter?: CalendarProps['formatter']
  32. showConfirm?: CalendarProps['showConfirm']
  33. confirmText?: CalendarProps['confirmText']
  34. firstDayOfWeek?: CalendarProps['firstDayOfWeek']
  35. round?: CalendarProps['round']
  36. // 自定义
  37. format?: string
  38. valueFormat?: string
  39. }>(),
  40. {
  41. format: 'YYYY-MM-DD',
  42. valueFormat: '',
  43. },
  44. )
  45. const fieldProps = computed(() => pick(props, ['label', 'name', 'id', 'size', 'placeholder', 'border', 'colon', 'required', 'center', 'arrowDirection', 'labelClass', 'labelWidth', 'labelAlign', 'leftIcon', 'rightIcon', 'rules']))
  46. const calendarProps = computed(() => pick(props, ['color', 'minDate', 'maxDate', 'formatter', 'showConfirm', 'confirmText', 'firstDayOfWeek', 'round']))
  47. const value = defineModel<string>()
  48. const valueStr = computed(() => value.value && dayjs(value.value).format(props.format))
  49. const valueDate = computed(() => dayjs(value.value).toDate())
  50. const showCalendar = ref(false)
  51. function onConfirm(date: Date) {
  52. value.value = dayjs(date).format(props.valueFormat)
  53. showCalendar.value = false
  54. }
  55. </script>
  56. <template>
  57. <van-field :model-value="valueStr" v-bind="fieldProps" is-link readonly @click="showCalendar = true" />
  58. <van-calendar v-model:show="showCalendar" v-bind="calendarProps" :default-date="valueDate" teleport="body" @confirm="onConfirm" />
  59. </template>