date-year.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <div class="hc-date-year-select hc-flex">
  3. <el-date-picker ref="startYearRef" v-model="startYears" type="year" value-format="YYYY" placeholder="计划开工年" :disabled="disabled" :clearable="false" @change="startYearChange" />
  4. <div class="to ml-2 mr-2 text-[14px]">至</div>
  5. <el-date-picker ref="endYearRef" v-model="endYears" type="year" value-format="YYYY" placeholder="计划完工年" :clearable="clearable" :disabled="disabled" @change="endYearChange" @blur="endYearBlur" />
  6. </div>
  7. </template>
  8. <script setup>
  9. import { ref, watch } from 'vue'
  10. import { isNullES } from 'js-fast-way'
  11. defineProps({
  12. disabled: {
  13. type: Boolean,
  14. default: false,
  15. },
  16. clearable: {
  17. type: Boolean,
  18. default: true,
  19. },
  20. })
  21. defineOptions({
  22. name: 'HcDateYear',
  23. })
  24. //双向绑定
  25. const startYear = defineModel('modelValue', {
  26. type: [String, Number],
  27. default: '',
  28. })
  29. const endYear = defineModel('end', {
  30. type: [String, Number],
  31. default: '',
  32. })
  33. //监听数据改变
  34. const startYears = ref('')
  35. const endYears = ref('')
  36. watch(() => [startYear.value, endYear.value], ([start, end]) => {
  37. startYears.value = start ? start + '' : ''
  38. endYears.value = end ? end + '' : ''
  39. }, { deep: true, immediate:true })
  40. //日期选择框ref
  41. const startYearRef = ref(null)
  42. const endYearRef = ref(null)
  43. //开始年
  44. const startYearChange = (val) => {
  45. startYear.value = val
  46. endYearRef.value?.focus()
  47. endYearRef.value?.handleOpen()
  48. startYearRef.value?.handleClose()
  49. }
  50. //结束年
  51. const endYearChange = (val) => {
  52. if (isNullES(val)) {
  53. startYear.value = ''
  54. }
  55. endYear.value = val
  56. if (val < startYear.value) {
  57. window.$message.warning('完工年不能小于开工年')
  58. endYear.value = ''
  59. endYearRef.value?.handleOpen()
  60. } else {
  61. endYearRef.value?.handleClose()
  62. }
  63. }
  64. //失去焦点
  65. const endYearBlur = () => {
  66. if (isNullES(startYear.value) || isNullES(endYear.value)) {
  67. startYear.value = ''
  68. endYear.value = ''
  69. window.$message.warning('请重新选择完整的范围年份')
  70. } else if (endYear.value < startYear.value) {
  71. startYear.value = ''
  72. endYear.value = ''
  73. window.$message.warning('完工年不能小于开工年')
  74. }
  75. console.log(startYear.value, endYear.value)
  76. }
  77. </script>
  78. <style lang="scss">
  79. .hc-date-year-select {
  80. .el-input.el-date-editor,
  81. .el-date-editor.el-input__wrapper {
  82. width: 124px;
  83. }
  84. }
  85. </style>