| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- <template>
- <view class="jnpf-date-range">
- <JnpfDatePicker v-if="type=='date'" v-model="startValue" placeholder="开始日期" :disabled="disabled"
- inputType="text" scene="searchList" :format="format" @change="change" :defaultTime="startDefaultTime"
- selectType='start' :key="key" ref="dateTime" />
- <JnpfTimePicker v-else v-model="startValue" placeholder="开始时间" :disabled="disabled" inputType="text"
- scene="searchList" :format="format" @change="change" :defaultTime="startDefaultTime" selectType='start'
- :key="key" ref="dateTime" />
- <view class="u-p-l-10 u-p-r-10">至</view>
- <JnpfDatePicker v-if="type=='date'" v-model="endValue" placeholder="结束日期" :disabled="disabled" inputType="text"
- scene="searchList" :format="format" @change="change" :defaultTime="endDefaultTime" selectType='end'
- :key="key+1" ref="dateTime" />
- <JnpfTimePicker v-else v-model="endValue" placeholder="结束时间" :disabled="disabled" inputType="text"
- scene="searchList" :format="format" @change="change" :defaultTime="endDefaultTime" selectType='end'
- :key="key+1" ref="dateTime" />
- </view>
- </template>
- <script>
- const DEFAULT_FORMAT = 'yyyy-mm-dd hh:MM:ss';
- export default {
- name: 'jnpf-date-range',
- props: {
- modelValue: {
- type: [Array, String],
- default: () => []
- },
- placeholder: {
- type: String,
- default: '请选择日期范围'
- },
- disabled: {
- type: Boolean,
- default: false
- },
- format: {
- type: String,
- default: 'yyyy-MM-dd HH:mm:ss'
- },
- type: {
- type: String,
- default: 'date'
- }
- },
- data() {
- return {
- startDefaultTime: '',
- endDefaultTime: '',
- startValue: '',
- endValue: '',
- datetimerange: [],
- datetimerangeObj: {},
- key: +new Date()
- }
- },
- watch: {
- modelValue: {
- handler(val) {
- if (Array.isArray(val) && val.length) {
- // 当 modelValue 是有效数组时,更新本地状态
- this.startValue = val[0];
- this.endValue = val[1];
- this.$set(this.datetimerangeObj, 'start', val[0]);
- this.$set(this.datetimerangeObj, 'end', val[1]);
- } else {
- // 清空本地状态
- this.startValue = '';
- this.endValue = '';
- this.datetimerangeObj = {};
- this.datetimerange = [];
- // 仅当 val 不是空数组时,才触发更新
- if (!Array.isArray(val) || val.length !== 0) {
- this.$emit('update:modelValue', []);
- }
- }
- },
- immediate: true,
- deep: true
- }
- },
- methods: {
- change(e, type) {
- this.datetimerange = [];
- this.$set(this.datetimerangeObj, type, e || '');
- // 始终使用开始时间作为参考时间
- const startValue = this.datetimerangeObj.start;
- this.setDefaultTime(startValue);
- this.handleValue();
- },
- setDefaultTime(value) {
- this.$refs.dateTime.defaultTime = this.type === 'time' ? value : this.$u.timeFormat(value, DEFAULT_FORMAT);
- },
- handleValue() {
- const {
- start,
- end
- } = this.datetimerangeObj;
- this.datetimerange = [start, end];
- if (this.shouldValidate()) {
- if (start > end) {
- this.handleInvalidRange();
- return;
- }
- }
- this.emitUpdate();
- },
- shouldValidate() {
- return this.datetimerangeObj.start && this.datetimerangeObj.end;
- },
- handleInvalidRange() {
- this.$u.toast('开始时间不能大于结束时间');
- this.clearValues();
- },
- clearValues() {
- setTimeout(() => {
- this.startValue = "";
- this.endValue = "";
- this.datetimerangeObj = {};
- this.datetimerange = [];
- this.emitUpdate();
- this.refreshComponent();
- }, 500);
- },
- emitUpdate() {
- this.$emit('update:modelValue', this.datetimerange);
- },
- refreshComponent() {
- this.key = +new Date();
- }
- }
- }
- </script>
|