vant/src/datetime-picker/TimePicker.js

106 lines
2.3 KiB
JavaScript

import { createNamespace } from '../utils';
import { padZero } from '../utils/format/string';
import { range } from '../utils/format/number';
import { sharedProps, TimePickerMixin } from './shared';
const [createComponent] = createNamespace('time-picker');
export default createComponent({
mixins: [TimePickerMixin],
props: {
...sharedProps,
minHour: {
type: Number,
default: 0
},
maxHour: {
type: Number,
default: 23
},
minMinute: {
type: Number,
default: 0
},
maxMinute: {
type: Number,
default: 59
}
},
computed: {
ranges() {
return [
{
type: 'hour',
range: [this.minHour, this.maxHour]
},
{
type: 'minute',
range: [this.minMinute, this.maxMinute]
}
];
}
},
watch: {
filter: 'updateInnerValue',
minHour: 'updateInnerValue',
maxHour: 'updateInnerValue',
minMinute: 'updateInnerValue',
maxMinute: 'updateInnerValue',
value(val) {
val = this.formatValue(val);
if (val !== this.innerValue) {
this.innerValue = val;
this.updateColumnValue(val);
}
}
},
methods: {
formatValue(value) {
if (!value) {
value = `${padZero(this.minHour)}:${padZero(this.minMinute)}`;
}
let [hour, minute] = value.split(':');
hour = padZero(range(hour, this.minHour, this.maxHour));
minute = padZero(range(minute, this.minMinute, this.maxMinute));
return `${hour}:${minute}`;
},
updateInnerValue() {
const indexes = this.$refs.picker.getIndexes();
const hour = this.originColumns[0].values[indexes[0]];
const minute = this.originColumns[1].values[indexes[1]];
const value = `${hour}:${minute}`;
this.innerValue = this.formatValue(value);
},
onChange(picker) {
this.updateInnerValue();
this.$nextTick(() => {
this.$nextTick(() => {
this.$emit('change', picker);
});
});
},
updateColumnValue() {
const { formatter } = this;
const pair = this.innerValue.split(':');
const values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
this.$nextTick(() => {
this.$refs.picker.setValues(values);
});
}
}
});