UNPKG

@jdcfe/yep-react

Version:

一套移动端的React组件库

518 lines (439 loc) 18.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var React = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); 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 _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var Item = function Item() { return null; }; ; var Picker = /*#__PURE__*/function (_React$Component) { (0, _inherits2.default)(Picker, _React$Component); var _super = _createSuper(Picker); function Picker(props) { var _this; (0, _classCallCheck2.default)(this, Picker); _this = _super.call(this, props); _this.scrollHandlers = function () { var scrollY = -1; var lastY = 0; var startY = 0; var scrollDisabled = false; var isMoving = false; var setTransform = function setTransform(nodeStyle, value) { nodeStyle.transform = value; nodeStyle.WebkitTransform = value; }; var setTransition = function setTransition(nodeStyle, value) { nodeStyle.transition = value; nodeStyle.WebkitTransition = value; }; var scrollTo = function scrollTo(_x, y) { var time = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.3; if (scrollY !== y) { scrollY = y; if (time) { setTransition(_this.contentRef.style, "cubic-bezier(0,0,0.2,1.15) ".concat(time, "s")); } setTransform(_this.contentRef.style, "translate3d(0,".concat(-y, "px,0)")); setTimeout(function () { _this.scrollingComplete(); if (_this.contentRef) { setTransition(_this.contentRef.style, ''); } }, +time * 1000); } }; //速度计 var Velocity = function () { var minInterval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30; var maxInterval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; var _time = 0; var _y = 0; var _velocity = 0; var recorder = { record: function record(y) { var now = +new Date(); _velocity = (y - _y) / (now - _time); if (now - _time >= minInterval) { _velocity = now - _time <= maxInterval ? _velocity : 0; _y = y; _time = now; } }, getVelocity: function getVelocity(y) { if (y !== _y) { recorder.record(y); } return _velocity; } }; return recorder; }(); var onStart = function onStart(y) { if (scrollDisabled) { return; } isMoving = true; startY = y; lastY = scrollY; }; var onMove = function onMove(y) { if (scrollDisabled || !isMoving) { return; } scrollY = lastY - y + startY; Velocity.record(y); _this.onScrollChange(); setTransform(_this.contentRef.style, "translate3d(0,".concat(-scrollY, "px,0)")); }; var onFinish = function onFinish() { isMoving = false; var targetY = scrollY; var height = (React.Children.count(_this.props.children) - 1) * _this.itemHeight; var time = 0.3; //const velocity = Velocity.getVelocity(targetY) * 4; //if (velocity) { //targetY = velocity * 40 + targetY; //time = Math.abs(velocity) * .1; //} if (targetY % _this.itemHeight !== 0) { targetY = Math.round(targetY / _this.itemHeight) * _this.itemHeight; } if (targetY < 0) { targetY = 0; } else if (targetY > height) { targetY = height; } scrollTo(0, targetY, time < 0.3 ? 0.3 : time); _this.onScrollChange(); }; return { touchstart: function touchstart(evt) { return onStart(evt.touches[0].screenY); }, mousedown: function mousedown(evt) { return onStart(evt.screenY); }, touchmove: function touchmove(evt) { evt.preventDefault(); onMove(evt.touches[0].screenY); }, mousemove: function mousemove(evt) { evt.preventDefault(); onMove(evt.screenY); }, touchend: function touchend() { return onFinish(); }, touchcancel: function touchcancel() { return onFinish(); }, mouseup: function mouseup() { return onFinish(); }, getValue: function getValue() { return scrollY; }, scrollTo: scrollTo, setDisabled: function setDisabled(disabled) { scrollDisabled = disabled; } }; }(); _this.createRootRef = _this.createRootRef.bind((0, _assertThisInitialized2.default)(_this)); _this.createMaskRef = _this.createMaskRef.bind((0, _assertThisInitialized2.default)(_this)); _this.createIndicatorRef = _this.createIndicatorRef.bind((0, _assertThisInitialized2.default)(_this)); _this.createContentRef = _this.createContentRef.bind((0, _assertThisInitialized2.default)(_this)); _this.passiveSupported = _this.passiveSupported.bind((0, _assertThisInitialized2.default)(_this)); _this.onScrollChange = _this.onScrollChange.bind((0, _assertThisInitialized2.default)(_this)); _this.scrollingComplete = _this.scrollingComplete.bind((0, _assertThisInitialized2.default)(_this)); _this.fireValueChange = _this.fireValueChange.bind((0, _assertThisInitialized2.default)(_this)); _this.scrollTo = _this.scrollTo.bind((0, _assertThisInitialized2.default)(_this)); _this.scrollToWithoutAnimation = _this.scrollToWithoutAnimation.bind((0, _assertThisInitialized2.default)(_this)); _this.select = _this.select.bind((0, _assertThisInitialized2.default)(_this)); _this.selectByIndex = _this.selectByIndex.bind((0, _assertThisInitialized2.default)(_this)); _this.doScrollingComplete = _this.doScrollingComplete.bind((0, _assertThisInitialized2.default)(_this)); _this.computeChildIndex = _this.computeChildIndex.bind((0, _assertThisInitialized2.default)(_this)); var selectedValueState; var selectedValue = props.selectedValue, defaultSelectedValue = props.defaultSelectedValue; if (selectedValue !== undefined) { selectedValueState = selectedValue; } else if (defaultSelectedValue !== undefined) { selectedValueState = defaultSelectedValue; } else { var children = React.Children.toArray(_this.props.children); // @ts-ignore selectedValueState = children && children[0] && children[0].props.value; } _this.state = { selectedValue: selectedValueState }; return _this; } (0, _createClass2.default)(Picker, [{ key: "createRootRef", value: function createRootRef(el) { this.rootRef = el; } }, { key: "createMaskRef", value: function createMaskRef(el) { this.maskRef = el; } }, { key: "createIndicatorRef", value: function createIndicatorRef(el) { this.indicatorRef = el; } }, { key: "createContentRef", value: function createContentRef(el) { this.contentRef = el; } }, { key: "passiveSupported", value: function passiveSupported() { var passiveSupported = false; try { var options = Object.defineProperty({}, 'passive', { get: function get() { passiveSupported = true; } }); window.addEventListener('test', function () {}, options); } catch (err) {} return passiveSupported; } }, { key: "onScrollChange", value: function onScrollChange() { var _this$props = this.props, children = _this$props.children, onScrollChange = _this$props.onScrollChange; var top = this.scrollHandlers.getValue(); if (top >= 0) { var index = this.computeChildIndex(top, this.itemHeight, React.Children.count(children)); if (this.scrollValue !== index) { this.scrollValue = index; // @ts-ignore var child = children[index]; if (child && onScrollChange) { onScrollChange(child.props.value); } else if (!child && console.warn) { console.warn('child not found', children, index); } } } } }, { key: "fireValueChange", value: function fireValueChange(selectedValue) { if (selectedValue !== this.state.selectedValue) { if (!('selectedValue' in this.props)) { this.setState({ selectedValue: selectedValue }); } if (this.props.onValueChange) { this.props.onValueChange(selectedValue); } } } }, { key: "scrollingComplete", value: function scrollingComplete() { var top = this.scrollHandlers.getValue(); if (top >= 0) { this.doScrollingComplete(top, this.itemHeight, this.fireValueChange); } } }, { key: "scrollTo", value: function scrollTo(top) { this.scrollHandlers.scrollTo(0, top); } }, { key: "scrollToWithoutAnimation", value: function scrollToWithoutAnimation(top) { this.scrollHandlers.scrollTo(0, top, 0); } }, { key: "componentDidMount", value: function componentDidMount() { var _this2 = this; var rootRef = this.rootRef, maskRef = this.maskRef, indicatorRef = this.indicatorRef, contentRef = this.contentRef; var rootHeight = rootRef.getBoundingClientRect().height; var itemHeight = this.itemHeight = indicatorRef.getBoundingClientRect().height; var itemNum = Math.floor(rootHeight / itemHeight); if (itemNum % 2 === 0) { itemNum--; } itemNum--; itemNum /= 2; contentRef.style.padding = "".concat(itemHeight * itemNum, "px 0"); indicatorRef.style.top = "".concat(itemHeight * itemNum, "px"); maskRef.style.backgroundSize = "100% ".concat(itemHeight * itemNum, "px"); this.scrollHandlers.setDisabled(this.props.disabled); this.select(this.state.selectedValue, this.itemHeight, this.scrollTo); var passiveSupported = this.passiveSupported(); var willPreventDefault = passiveSupported ? { passive: false } : false; var willNotPreventDefault = passiveSupported ? { passive: true } : false; Object.keys(this.scrollHandlers).forEach(function (key) { if (key.indexOf('touch') === 0 || key.indexOf('mouse') === 0) { var pd = key.indexOf('move') >= 0 ? willPreventDefault : willNotPreventDefault; // @ts-ignore rootRef.addEventListener(key, _this2.scrollHandlers[key], pd); } }); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { var _this3 = this; if ('selectedValue' in nextProps) { if (this.state.selectedValue !== nextProps.selectedValue) { this.setState({ selectedValue: nextProps.selectedValue }, function () { _this3.select(nextProps.selectedValue, _this3.itemHeight, nextProps.noAnimate ? _this3.scrollToWithoutAnimation : _this3.scrollTo); }); } } this.scrollHandlers.setDisabled(nextProps.disabled); } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps, nextState) { return this.state.selectedValue !== nextState.selectedValue || this.props.children !== nextProps.children; } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.select(this.state.selectedValue, this.itemHeight, this.scrollToWithoutAnimation); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this4 = this; Object.keys(this.scrollHandlers).forEach(function (key) { if (key.indexOf('touch') === 0 || key.indexOf('mouse') === 0) { // @ts-ignore _this4.rootRef.removeEventListener(key, _this4.scrollHandlers[key]); } }); } }, { key: "select", value: function select(value, itemHeight, scrollTo) { var children = React.Children.toArray(this.props.children); for (var i = 0, len = children.length; i < len; i++) { // @ts-ignore if (children[i].props.value === value) { this.selectByIndex(i, itemHeight, scrollTo); return; } } this.selectByIndex(0, itemHeight, scrollTo); } }, { key: "selectByIndex", value: function selectByIndex(index, itemHeight, zscrollTo) { if (index < 0 || index >= React.Children.count(this.props.children) || !itemHeight) { return; } zscrollTo(index * itemHeight); } }, { key: "computeChildIndex", value: function computeChildIndex(top, itemHeight, childrenLength) { var index = top / itemHeight; var floor = Math.floor(index); if (index - floor > 0.5) { index = floor + 1; } else { index = floor; } return Math.min(index, childrenLength - 1); } }, { key: "doScrollingComplete", value: function doScrollingComplete(top, itemHeight, fireValueChange) { var children = React.Children.toArray(this.props.children); var index = this.computeChildIndex(top, itemHeight, children.length); var child = children[index]; if (child) { fireValueChange(child.props.value); } else if (console.warn) { console.warn('child not found', child, index); } } }, { key: "render", value: function render() { var _this5 = this; var _this$props2 = this.props, className = _this$props2.className, prefixCls = _this$props2.prefixCls, style = _this$props2.style, indicatorStyle = _this$props2.indicatorStyle, itemStyle = _this$props2.itemStyle, children = _this$props2.children; var cls = (0, _classnames.default)(prefixCls, (0, _defineProperty2.default)({}, className, !!className)); var map = function map(item) { var _item$props = item.props, _item$props$className = _item$props.className, className = _item$props$className === void 0 ? '' : _item$props$className, style = _item$props.style, value = _item$props.value; return /*#__PURE__*/React.createElement("div", { style: Object.assign(Object.assign({}, itemStyle), style), key: value, className: (0, _classnames.default)("".concat(prefixCls, "-item"), className, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-item-selected"), value === _this5.state.selectedValue)) }, item.children || item.props.children); }; // @ts-ignore var items = React.Children ? React.Children.map(children, map) : [].concat(children).map(map); return /*#__PURE__*/React.createElement("div", { className: cls, style: style, ref: this.createRootRef }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-mask"), ref: this.createMaskRef }), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-indicator"), style: indicatorStyle, ref: this.createIndicatorRef }), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content"), ref: this.createContentRef }, items)); } }]); return Picker; }(React.Component); Picker.Item = Item; Picker.defaultProps = { prefixCls: 'Yep-picker', disabled: false }; var _default = Picker; exports.default = _default;