vant/src/datetime-picker/TimePicker.js

108 lines
2.5 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, String],
default: 0,
},
maxHour: {
type: [Number, String],
default: 23,
},
minMinute: {
type: [Number, String],
default: 0,
},
maxMinute: {
type: [Number, String],
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();
}
},
},
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 [hourIndex, minuteIndex] = this.getPicker().getIndexes();
const [hourColumn, minuteColumn] = this.originColumns;
const hour = hourColumn.values[hourIndex] || hourColumn.values[0];
const minute = minuteColumn.values[minuteIndex] || minuteColumn.values[0];
this.innerValue = this.formatValue(`${hour}:${minute}`);
this.updateColumnValue();
},
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.getPicker().setValues(values);
});
},
},
});