taro-ui-vue3
Version:
Taro UI Rewritten in Vue 3.0
197 lines (196 loc) • 6.18 kB
JavaScript
var __defProp = Object.defineProperty;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
var __objSpread = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
import {h, defineComponent, nextTick, reactive, ref, watch, onMounted, computed, mergeProps} from "vue";
import {View} from "@tarojs/components";
import {
delayQuerySelector,
getEventDetail,
mergeStyle
} from "../utils/common";
const AtRange = defineComponent({
name: "AtRange",
props: {
sliderStyle: {
type: [Object, String],
default: ""
},
railStyle: {
type: [Object, String],
default: ""
},
trackStyle: {
type: [Object, String],
default: ""
},
value: {
type: Array,
default: [0, 0]
},
min: {
type: Number,
default: 0
},
max: {
type: Number,
default: 100
},
blockSize: {
type: Number,
default: 0
},
disabled: {
type: Boolean,
default: false
},
onChange: Function,
onAfterChange: Function
},
setup(props, {attrs}) {
const width = ref(0);
const left = ref(0);
const currentSlider = ref("");
const state = reactive({
aX: 0,
bX: 0
});
const deltaValue = computed(() => props.max - props.min);
const rootClasses = computed(() => ({
"at-range": true,
"at-range--disabled": props.disabled
}));
const sliderCommonStyle = computed(() => ({
width: props.blockSize ? `${props.blockSize}PX` : "",
height: props.blockSize ? `${props.blockSize}PX` : "",
marginLeft: props.blockSize ? `${-props.blockSize / 2}PX` : ""
}));
const sliderAStyle = computed(() => mergeStyle(props.sliderStyle, __objSpread(__objSpread({}, sliderCommonStyle.value), {
left: `${state.aX}%`,
top: "0%"
})));
const sliderBStyle = computed(() => mergeStyle(props.sliderStyle, __objSpread(__objSpread({}, sliderCommonStyle.value), {
left: `${state.bX}%`,
top: "0%"
})));
const containerStyle = computed(() => ({
height: props.blockSize ? `${props.blockSize}PX` : ""
}));
const atTrackStyle = computed(() => mergeStyle(props.trackStyle, {
left: `${Math.min(state.aX, state.bX)}%`,
width: `${Math.abs(state.aX - state.bX)}%`
}));
function handleClick(event) {
if (currentSlider.value && !props.disabled) {
let sliderValue = 0;
const detail = getEventDetail(event);
sliderValue = detail.x - left.value;
setSliderValue(currentSlider.value, sliderValue, "onChange");
}
}
function handleTouchMove(sliderName, event) {
if (props.disabled)
return;
event.stopPropagation();
const clientX = event.touches[0].clientX;
setSliderValue(sliderName, clientX - left.value, "onChange");
}
function handleTouchEnd(sliderName) {
if (props.disabled)
return;
currentSlider.value = sliderName;
triggerEvent("onAfterChange");
}
function setSliderValue(sliderName, targetValue, funcName) {
const distance = Math.min(Math.max(targetValue, 0), width.value);
const sliderValue = Math.floor(distance / width.value * 100);
if (funcName) {
state[sliderName] = sliderValue;
nextTick(() => triggerEvent(funcName));
} else {
state[sliderName] = sliderValue;
}
}
function setValue(value) {
const aX = Math.round((value[0] - props.min) / deltaValue.value * 100);
const bX = Math.round((value[1] - props.min) / deltaValue.value * 100);
state.aX = aX;
state.bX = bX;
}
function triggerEvent(funcName) {
const {aX, bX} = state;
const a = Math.round(aX / 100 * deltaValue.value) + props.min;
const b = Math.round(bX / 100 * deltaValue.value) + props.min;
const result = [a, b].sort((x, y) => x - y);
if (funcName === "onChange") {
props.onChange && props.onChange(result);
} else if (funcName === "onAfterChange") {
props.onAfterChange && props.onAfterChange(result);
}
}
function updatePos() {
delayQuerySelector(this, ".at-range__container", 10).then((rect) => {
width.value = Math.round(rect[0].width);
left.value = Math.round(rect[0].left);
});
}
watch(() => props.value, (value, oldValue) => {
updatePos();
if (oldValue[0] !== value[0] || oldValue[1] !== value[1]) {
setValue(value);
}
});
onMounted(() => {
updatePos();
setValue(props.value);
});
return () => h(View, mergeProps(attrs, {
class: rootClasses.value,
onTap: handleClick
}), {
default: () => [
h(View, {
class: "at-range__container",
style: containerStyle.value
}, {
default: () => [
h(View, {
class: "at-range__rail",
style: props.railStyle
}, {
default: () => [
h(View, {
class: "at-range__track",
style: atTrackStyle.value
}),
...["aX", "bX"].map((sliderName, index) => h(View, {
key: `${sliderName} - ${index}`,
class: "at-range__slider",
style: sliderName === "aX" ? sliderAStyle.value : sliderBStyle.value,
onTouchend: handleTouchEnd.bind(this, sliderName),
onTouchmove: handleTouchMove.bind(this, sliderName)
}))
]
})
]
})
]
});
}
});
var range_default = AtRange;
export {
range_default as default
};