import { VantComponent } from '../common/component'; import { touch } from '../mixins/touch'; import { canIUseModel } from '../common/version'; VantComponent({ mixins: [touch], props: { disabled: Boolean, useButtonSlot: Boolean, activeColor: String, inactiveColor: String, max: { type: Number, value: 100, }, min: { type: Number, value: 0, }, step: { type: Number, value: 1, }, value: { type: Number, value: 0, observer(val) { if (val !== this.value) { this.updateValue(val); } }, }, barHeight: { type: null, value: 2, }, }, created() { this.updateValue(this.data.value); }, methods: { onTouchStart(event) { if (this.data.disabled) return; this.touchStart(event); this.startValue = this.format(this.value); this.dragStatus = 'start'; }, onTouchMove(event) { if (this.data.disabled) return; if (this.dragStatus === 'start') { this.$emit('drag-start'); } this.touchMove(event); this.dragStatus = 'draging'; this.getRect('.van-slider').then((rect) => { const diff = (this.deltaX / rect.width) * 100; this.newValue = this.startValue + diff; this.updateValue(this.newValue, false, true); }); }, onTouchEnd() { if (this.data.disabled) return; if (this.dragStatus === 'draging') { this.updateValue(this.newValue, true); this.$emit('drag-end'); } }, onClick(event) { if (this.data.disabled) return; const { min } = this.data; this.getRect('.van-slider').then((rect) => { const value = ((event.detail.x - rect.left) / rect.width) * this.getRange() + min; this.updateValue(value, true); }); }, updateValue(value, end, drag) { value = this.format(value); const { min } = this.data; const width = `${((value - min) * 100) / this.getRange()}%`; this.value = value; this.setData({ barStyle: ` width: ${width}; ${drag ? 'transition: none;' : ''} `, }); if (drag) { this.$emit('drag', { value }); } if (end) { this.$emit('change', value); } if ((drag || end) && canIUseModel()) { this.setData({ value }); } }, getRange() { const { max, min } = this.data; return max - min; }, format(value) { const { max, min, step } = this.data; return Math.round(Math.max(min, Math.min(value, max)) / step) * step; }, }, });