vantui-edit
Version:
一套适用于Taro3及React的vantui组件库
385 lines (323 loc) • 14.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Slider = Slider;
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _components = require("@tarojs/components");
var _taro = require("@tarojs/taro");
var utils = _interopRequireWildcard(require("../wxs/utils"));
var _style = require("../wxs/style");
var _version = require("../common/version");
var _utils2 = require("../common/utils");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["range", "disabled", "activeColor", "inactiveColor", "max", "min", "step", "value", "barHeight", "vertical", "onDrag", "onChange", "onDragStart", "onDragEnd", "className", "renderButton"];
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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) { (0, _defineProperty2.default)(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; }
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 '';
}
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 = (0, _objectWithoutProperties2.default)(props, _excluded);
var _useState = (0, _react.useState)(),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
barStyle = _useState2[0],
setBarStyle = _useState2[1];
var _useState3 = (0, _react.useState)(),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
wrapperStyle = _useState4[0],
setWrapperStyle = _useState4[1];
var _useState5 = (0, _react.useState)(),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
value_ = _useState6[0],
setValue = _useState6[1];
var _useState7 = (0, _react.useState)(),
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
dragStatus = _useState8[0],
setDragStatus = _useState8[1];
var _useState9 = (0, _react.useState)(),
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
buttonIndex = _useState10[0],
setButtonIndex = _useState10[1];
var _useState11 = (0, _react.useState)({}),
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
touchState = _useState12[0],
setTouchState = _useState12[1];
var _useState13 = (0, _react.useState)({}),
_useState14 = (0, _slicedToArray2.default)(_useState13, 2),
newValue = _useState14[0],
setNewValue = _useState14[1];
var _useState15 = (0, _react.useState)(),
_useState16 = (0, _slicedToArray2.default)(_useState15, 2),
startValue = _useState16[0],
setstartValue = _useState16[1];
var indexRef = (0, _react.useRef)("".concat(+new Date()).concat(Math.ceil(Math.random() * 10000)));
var resetTouchStatus = (0, _react.useCallback)(function () {
setTouchState(_objectSpread(_objectSpread({}, touchState), {}, {
direction: '',
deltaX: 0,
deltaY: 0,
offsetX: 0,
offsetY: 0
}));
}, [touchState]);
var touchStart = (0, _react.useCallback)(function (event) {
resetTouchStatus();
var touch = event.touches[0];
setTouchState(_objectSpread(_objectSpread({}, touchState), {}, {
startX: touch.clientX,
startY: touch.clientY
}));
}, [touchState, resetTouchStatus]);
var touchMove = (0, _react.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)
});
(0, _taro.nextTick)(function () {
setTouchState(newTouchState);
});
return newTouchState;
}, [touchState, resetTouchStatus]);
var isRange = (0, _react.useCallback)(function (value) {
return range && Array.isArray(value);
}, [range]);
var getScope = (0, _react.useCallback)(function (max, min) {
return Number(max) - Number(min);
}, []);
var calcMainAxis = (0, _react.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 = (0, _react.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 = (0, _react.useCallback)(function (value) {
return Math.round(Math.max(min, Math.min(value, max)) / step) * step;
}, [max, min, step]);
var handleOverlap = (0, _react.useCallback)(function (value) {
if (value[0] > value[1]) {
return value.slice(0).reverse();
}
return value;
}, []);
var updateValue = (0, _react.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((0, _defineProperty2.default)({
background: inactiveColor || ''
}, vertical ? 'width' : 'height', (0, _utils2.addUnit)(barHeight) || ''));
var styleBar = (_styleBar = {}, (0, _defineProperty2.default)(_styleBar, mainAxis, calcMainAxis(value)), (0, _defineProperty2.default)(_styleBar, "left", vertical ? 0 : calcOffset(value)), (0, _defineProperty2.default)(_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) && (0, _version.canIUseModel)()) {
(0, _taro.nextTick)(function () {
setValue(value);
});
}
}, [calcMainAxis, format, handleOverlap, isRange, onChange, onDrag, barHeight, calcOffset, inactiveColor, vertical]);
(0, _react.useEffect)(function () {
setValue(value);
updateValue(value);
}, [value, updateValue]);
var _onTouchStart = (0, _react.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 = (0, _react.useCallback)(function () {
return max - min;
}, [max, min]);
var onTouchMove = (0, _react.useCallback)(function (event) {
event.preventDefault();
if (disabled) return;
if (dragStatus === 'start') {
if (onDragStart) onDragStart();
}
var touchState = touchMove(event);
setDragStatus('draging');
(0, _utils2.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 = (0, _react.useCallback)(function () {
if (disabled) return;
if (dragStatus === 'draging') {
updateValue(newValue, true);
if (onDragEnd) onDragEnd();
}
}, [disabled, dragStatus, newValue, onDragEnd, updateValue]);
var onClick = (0, _react.useCallback)(function (event) {
event.preventDefault();
if (disabled) return;
(0, _utils2.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_ = (0, _slicedToArray2.default)(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__*/(0, _jsxRuntime.jsx)(_components.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__*/(0, _jsxRuntime.jsxs)(_components.View, {
className: utils.bem('slider__bar'),
style: (0, _style.style)(_objectSpread(_objectSpread({}, barStyle), {}, {
backgroundColor: activeColor
})),
children: [range && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: utils.bem('slider__button-wrapper-left'),
onTouchStart: function onTouchStart(e) {
return _onTouchStart(e, 0);
},
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
onTouchCancel: onTouchEnd,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: renderButton || /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: utils.bem('slider__button')
})
})
}), range && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: utils.bem('slider__button-wrapper-right'),
onTouchStart: function onTouchStart(e) {
return _onTouchStart(e, 1);
},
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
onTouchCancel: onTouchEnd,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: renderButton || /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: utils.bem('slider__button')
})
})
}), !range && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: utils.bem('slider__button-wrapper'),
onTouchStart: _onTouchStart,
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
onTouchCancel: onTouchEnd,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: renderButton || /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, {
className: utils.bem('slider__button')
})
})
})]
})
}));
}
var _default = Slider;
exports.default = _default;