index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <view class="jnpf-date-range">
  3. <JnpfDatePicker v-if="type=='date'" v-model="startValue" placeholder="开始日期" :disabled="disabled"
  4. inputType="text" scene="searchList" :format="format" @change="change" :defaultTime="startDefaultTime"
  5. selectType='start' :key="key" ref="dateTime" />
  6. <JnpfTimePicker v-else v-model="startValue" placeholder="开始时间" :disabled="disabled" inputType="text"
  7. scene="searchList" :format="format" @change="change" :defaultTime="startDefaultTime" selectType='start'
  8. :key="key" ref="dateTime" />
  9. <view class="u-p-l-10 u-p-r-10">至</view>
  10. <JnpfDatePicker v-if="type=='date'" v-model="endValue" placeholder="结束日期" :disabled="disabled" inputType="text"
  11. scene="searchList" :format="format" @change="change" :defaultTime="endDefaultTime" selectType='end'
  12. :key="key+1" ref="dateTime" />
  13. <JnpfTimePicker v-else v-model="endValue" placeholder="结束时间" :disabled="disabled" inputType="text"
  14. scene="searchList" :format="format" @change="change" :defaultTime="endDefaultTime" selectType='end'
  15. :key="key+1" ref="dateTime" />
  16. </view>
  17. </template>
  18. <script>
  19. const DEFAULT_FORMAT = 'yyyy-mm-dd hh:MM:ss';
  20. export default {
  21. name: 'jnpf-date-range',
  22. props: {
  23. modelValue: {
  24. type: [Array, String],
  25. default: () => []
  26. },
  27. placeholder: {
  28. type: String,
  29. default: '请选择日期范围'
  30. },
  31. disabled: {
  32. type: Boolean,
  33. default: false
  34. },
  35. format: {
  36. type: String,
  37. default: 'yyyy-MM-dd HH:mm:ss'
  38. },
  39. type: {
  40. type: String,
  41. default: 'date'
  42. }
  43. },
  44. data() {
  45. return {
  46. startDefaultTime: '',
  47. endDefaultTime: '',
  48. startValue: '',
  49. endValue: '',
  50. datetimerange: [],
  51. datetimerangeObj: {},
  52. key: +new Date()
  53. }
  54. },
  55. watch: {
  56. modelValue: {
  57. handler(val) {
  58. if (Array.isArray(val) && val.length) {
  59. // 当 modelValue 是有效数组时,更新本地状态
  60. this.startValue = val[0];
  61. this.endValue = val[1];
  62. this.$set(this.datetimerangeObj, 'start', val[0]);
  63. this.$set(this.datetimerangeObj, 'end', val[1]);
  64. } else {
  65. // 清空本地状态
  66. this.startValue = '';
  67. this.endValue = '';
  68. this.datetimerangeObj = {};
  69. this.datetimerange = [];
  70. // 仅当 val 不是空数组时,才触发更新
  71. if (!Array.isArray(val) || val.length !== 0) {
  72. this.$emit('update:modelValue', []);
  73. }
  74. }
  75. },
  76. immediate: true,
  77. deep: true
  78. }
  79. },
  80. methods: {
  81. change(e, type) {
  82. this.datetimerange = [];
  83. this.$set(this.datetimerangeObj, type, e || '');
  84. // 始终使用开始时间作为参考时间
  85. const startValue = this.datetimerangeObj.start;
  86. this.setDefaultTime(startValue);
  87. this.handleValue();
  88. },
  89. setDefaultTime(value) {
  90. this.$refs.dateTime.defaultTime = this.type === 'time' ? value : this.$u.timeFormat(value, DEFAULT_FORMAT);
  91. },
  92. handleValue() {
  93. const {
  94. start,
  95. end
  96. } = this.datetimerangeObj;
  97. this.datetimerange = [start, end];
  98. if (this.shouldValidate()) {
  99. if (start > end) {
  100. this.handleInvalidRange();
  101. return;
  102. }
  103. }
  104. this.emitUpdate();
  105. },
  106. shouldValidate() {
  107. return this.datetimerangeObj.start && this.datetimerangeObj.end;
  108. },
  109. handleInvalidRange() {
  110. this.$u.toast('开始时间不能大于结束时间');
  111. this.clearValues();
  112. },
  113. clearValues() {
  114. setTimeout(() => {
  115. this.startValue = "";
  116. this.endValue = "";
  117. this.datetimerangeObj = {};
  118. this.datetimerange = [];
  119. this.emitUpdate();
  120. this.refreshComponent();
  121. }, 500);
  122. },
  123. emitUpdate() {
  124. this.$emit('update:modelValue', this.datetimerange);
  125. },
  126. refreshComponent() {
  127. this.key = +new Date();
  128. }
  129. }
  130. }
  131. </script>