DatePicker.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <template>
  2. <v-layout row wrap>
  3. <v-menu
  4. ref="menu"
  5. v-model="menu"
  6. :close-on-content-click="false"
  7. :nudge-right="40"
  8. :return-value.sync="modelValue"
  9. lazy
  10. transition="scale-transition"
  11. offset-y
  12. full-width
  13. min-width="290px"
  14. >
  15. <template v-slot:activator="{ on, attrs }">
  16. <v-text-field
  17. v-model="displayDate"
  18. :label="label"
  19. readonly
  20. v-on="on"
  21. @blur="menu = false"
  22. ></v-text-field>
  23. </template>
  24. <v-date-picker
  25. color="primary"
  26. :model-value="modelValue"
  27. :locale="i18n.locale.value"
  28. @update:model-value="updateDate"
  29. no-title
  30. scrollable
  31. @change="menu = false"
  32. >
  33. </v-date-picker>
  34. </v-menu>
  35. </v-layout>
  36. </template>
  37. <script setup lang="ts">
  38. import { ref, computed } from 'vue'
  39. import { useI18n } from 'vue-i18n'
  40. const props = defineProps({
  41. modelValue: Date,
  42. label: String,
  43. })
  44. const emit = defineEmits(['update:modelValue'])
  45. const i18n = useI18n()
  46. const menu = ref(false)
  47. const displayDate = computed({
  48. get: () =>
  49. props.modelValue
  50. ? props.modelValue.toLocaleDateString(i18n.locale.value)
  51. : '',
  52. set: (val) => {},
  53. })
  54. function updateDate(value) {
  55. emit('update:modelValue', value)
  56. menu.value = false
  57. }
  58. </script>