vantui-edit
Version:
一套适用于Taro3及React的vantui组件库
358 lines (314 loc) • 12.5 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
var _excluded = ["range", "disabled", "activeColor", "inactiveColor", "max", "min", "step", "value", "barHeight", "vertical", "onDrag", "onChange", "onDragStart", "onDragEnd", "className", "renderButton"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
import React, { useState, useEffect, useCallback, useRef } from 'react';
import { View } from '@tarojs/components';
import { nextTick } from '@tarojs/taro';
import * as utils from '../wxs/utils';
import { style } from '../wxs/style';
import { canIUseModel } from '../common/version';
import { getRect, addUnit } from '../common/utils';
import { jsx as _jsx } from "react/jsx-runtime";
import { Fragment as _Fragment } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
var MIN_DISTANCE = 10;
function getDirection(x, y) {
if (x > y && x > MIN_DISTANCE) {
return 'horizontal';
}
if (y > x && y > MIN_DISTANCE) {
return 'vertical';
}
return '';
}
export function Slider(props) {
var range = props.range,
disabled = props.disabled,
activeColor = props.activeColor,
inactiveColor = props.inactiveColor,
_props$max = props.max,
max = _props$max === void 0 ? 100 : _props$max,
_props$min = props.min,
min = _props$min === void 0 ? 0 : _props$min,
_props$step = props.step,
step = _props$step === void 0 ? 1 : _props$step,
_props$value = props.value,
value = _props$value === void 0 ? 0 : _props$value,
barHeight = props.barHeight,
_props$vertical = props.vertical,
vertical = _props$vertical === void 0 ? false : _props$vertical,
onDrag = props.onDrag,
onChange = props.onChange,
onDragStart = props.onDragStart,
onDragEnd = props.onDragEnd,
_props$className = props.className,
className = _props$className === void 0 ? '' : _props$className,
renderButton = props.renderButton,
others = _objectWithoutProperties(props, _excluded);
var _useState = useState(),
_useState2 = _slicedToArray(_useState, 2),
barStyle = _useState2[0],
setBarStyle = _useState2[1];
var _useState3 = useState(),
_useState4 = _slicedToArray(_useState3, 2),
wrapperStyle = _useState4[0],
setWrapperStyle = _useState4[1];
var _useState5 = useState(),
_useState6 = _slicedToArray(_useState5, 2),
value_ = _useState6[0],
setValue = _useState6[1];
var _useState7 = useState(),
_useState8 = _slicedToArray(_useState7, 2),
dragStatus = _useState8[0],
setDragStatus = _useState8[1];
var _useState9 = useState(),
_useState10 = _slicedToArray(_useState9, 2),
buttonIndex = _useState10[0],
setButtonIndex = _useState10[1];
var _useState11 = useState({}),
_useState12 = _slicedToArray(_useState11, 2),
touchState = _useState12[0],
setTouchState = _useState12[1];
var _useState13 = useState({}),
_useState14 = _slicedToArray(_useState13, 2),
newValue = _useState14[0],
setNewValue = _useState14[1];
var _useState15 = useState(),
_useState16 = _slicedToArray(_useState15, 2),
startValue = _useState16[0],
setstartValue = _useState16[1];
var indexRef = useRef("".concat(+new Date()).concat(Math.ceil(Math.random() * 10000)));
var resetTouchStatus = useCallback(function () {
setTouchState(_objectSpread(_objectSpread({}, touchState), {}, {
direction: '',
deltaX: 0,
deltaY: 0,
offsetX: 0,
offsetY: 0
}));
}, [touchState]);
var touchStart = useCallback(function (event) {
resetTouchStatus();
var touch = event.touches[0];
setTouchState(_objectSpread(_objectSpread({}, touchState), {}, {
startX: touch.clientX,
startY: touch.clientY
}));
}, [touchState, resetTouchStatus]);
var touchMove = useCallback(function (event) {
resetTouchStatus();
var touch = event.touches[0];
var newTouchState = _objectSpread(_objectSpread({}, touchState), {}, {
direction: touchState.direction || getDirection(touchState.offsetX, touchState.offsetY),
deltaX: touch.clientX - (touchState.startX || 0),
deltaY: touch.clientY - (touchState.startY || 0),
offsetX: Math.abs(touchState.deltaX),
offsetY: Math.abs(touchState.deltaY)
});
nextTick(function () {
setTouchState(newTouchState);
});
return newTouchState;
}, [touchState, resetTouchStatus]);
var isRange = useCallback(function (value) {
return range && Array.isArray(value);
}, [range]);
var getScope = useCallback(function (max, min) {
return Number(max) - Number(min);
}, []);
var calcMainAxis = useCallback(function (value_) {
var scope = getScope(max, min);
if (isRange(value_)) {
return "".concat((value_[1] - value_[0]) * 100 / scope, "%");
}
return "".concat((value_ - Number(min)) * 100 / scope, "%");
}, [getScope, isRange, max, min]);
var calcOffset = useCallback(function (value_) {
var scope = getScope(max, min);
if (isRange(value_)) {
return (value_[0] - Number(min)) * 100 / scope + '%';
}
return '0%';
}, [getScope, isRange, max, min]);
var format = useCallback(function (value) {
return Math.round(Math.max(min, Math.min(value, max)) / step) * step;
}, [max, min, step]);
var handleOverlap = useCallback(function (value) {
if (value[0] > value[1]) {
return value.slice(0).reverse();
}
return value;
}, []);
var updateValue = useCallback(function (value, end, drag) {
var _styleBar;
if (isRange(value)) {
value = handleOverlap(value).map(function (val) {
return format(val);
});
} else {
value = format(value);
}
var mainAxis = vertical ? 'height' : 'width';
setValue(value);
setWrapperStyle(_defineProperty({
background: inactiveColor || ''
}, vertical ? 'width' : 'height', addUnit(barHeight) || ''));
var styleBar = (_styleBar = {}, _defineProperty(_styleBar, mainAxis, calcMainAxis(value)), _defineProperty(_styleBar, "left", vertical ? 0 : calcOffset(value)), _defineProperty(_styleBar, "top", vertical ? calcOffset(value) : 0), _styleBar);
if (drag) styleBar.transition = 'none';
setBarStyle(styleBar);
drag ? 'transition: none;' : '';
if (drag && onDrag) {
onDrag({
detail: {
value: value
}
});
}
if (end && onChange) {
onChange({
detail: value
});
}
if ((drag || end) && canIUseModel()) {
nextTick(function () {
setValue(value);
});
}
}, [calcMainAxis, format, handleOverlap, isRange, onChange, onDrag, barHeight, calcOffset, inactiveColor, vertical]);
useEffect(function () {
setValue(value);
updateValue(value);
}, [value, updateValue]);
var _onTouchStart = useCallback(function (event, index) {
if (disabled) return;
if (typeof index === 'number') {
setButtonIndex(index || 0);
}
touchStart(event);
setstartValue(format(value_));
setNewValue(value_);
if (isRange(value_)) {
setstartValue(value_.map(function (val) {
return format(val);
}));
} else {
setstartValue(format(value_));
}
setDragStatus('start');
}, [disabled, format, isRange, touchStart, value_]);
var getRange = useCallback(function () {
return max - min;
}, [max, min]);
var onTouchMove = useCallback(function (event) {
event.preventDefault();
if (disabled) return;
if (dragStatus === 'start') {
if (onDragStart) onDragStart();
}
var touchState = touchMove(event);
setDragStatus('draging');
getRect(null, ".van-slider".concat(indexRef.current)).then(function (rect) {
var diff = touchState.deltaX / rect.width * getRange();
if (vertical) {
diff = touchState.deltaY / rect.height * getRange();
}
if (isRange(startValue)) {
newValue[buttonIndex] = startValue[buttonIndex] + diff;
setNewValue(newValue);
} else {
var newValue_ = newValue;
newValue_ = (startValue || 0) + diff;
setNewValue(newValue_);
}
updateValue(newValue, false, true);
});
}, [disabled, dragStatus, touchMove, onDragStart, getRange, vertical, isRange, startValue, updateValue, newValue, buttonIndex]);
var onTouchEnd = useCallback(function () {
if (disabled) return;
if (dragStatus === 'draging') {
updateValue(newValue, true);
if (onDragEnd) onDragEnd();
}
}, [disabled, dragStatus, newValue, onDragEnd, updateValue]);
var onClick = useCallback(function (event) {
event.preventDefault();
if (disabled) return;
getRect(null, ".van-slider".concat(indexRef.current)).then(function (rect) {
var target = process.env.TARO_ENV === 'h5' ? event : event.detail;
var value = ((target.x || target.clientX) - rect.left) / rect.width * getRange() + Number(min);
if (vertical) {
value = ((target.y || target.clientY) - rect.top) / rect.height * getRange() + Number(min);
}
if (isRange(value_)) {
var _value_ = _slicedToArray(value_, 2),
left = _value_[0],
right = _value_[1];
var middle = (left + right) / 2;
if (value <= middle) {
updateValue([value, right], true);
} else {
updateValue([left, value], true);
}
} else {
updateValue(value, true);
}
});
}, [disabled, getRange, min, vertical, isRange, value_, updateValue]);
return /*#__PURE__*/_jsx(View, _objectSpread(_objectSpread({
className: ' ' + utils.bem('slider', {
disabled: disabled,
vertical: vertical
}) + " van-slider".concat(indexRef.current, " ") + className,
style: utils.style([wrapperStyle, others.style]),
onClick: onClick
}, others), {}, {
children: /*#__PURE__*/_jsxs(View, {
className: utils.bem('slider__bar'),
style: style(_objectSpread(_objectSpread({}, barStyle), {}, {
backgroundColor: activeColor
})),
children: [range && /*#__PURE__*/_jsx(View, {
className: utils.bem('slider__button-wrapper-left'),
onTouchStart: function onTouchStart(e) {
return _onTouchStart(e, 0);
},
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
onTouchCancel: onTouchEnd,
children: /*#__PURE__*/_jsx(_Fragment, {
children: renderButton || /*#__PURE__*/_jsx(View, {
className: utils.bem('slider__button')
})
})
}), range && /*#__PURE__*/_jsx(View, {
className: utils.bem('slider__button-wrapper-right'),
onTouchStart: function onTouchStart(e) {
return _onTouchStart(e, 1);
},
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
onTouchCancel: onTouchEnd,
children: /*#__PURE__*/_jsx(_Fragment, {
children: renderButton || /*#__PURE__*/_jsx(View, {
className: utils.bem('slider__button')
})
})
}), !range && /*#__PURE__*/_jsx(View, {
className: utils.bem('slider__button-wrapper'),
onTouchStart: _onTouchStart,
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
onTouchCancel: onTouchEnd,
children: /*#__PURE__*/_jsx(_Fragment, {
children: renderButton || /*#__PURE__*/_jsx(View, {
className: utils.bem('slider__button')
})
})
})]
})
}));
}
export default Slider;