UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

291 lines (290 loc) 13.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var react_1 = tslib_1.__importStar(require("react")); var prop_types_1 = tslib_1.__importDefault(require("prop-types")); var react_lifecycles_compat_1 = require("react-lifecycles-compat"); var util_1 = require("../../util"); var event_handlers_1 = tslib_1.__importDefault(require("./mixins/event-handlers")); var helpers_1 = tslib_1.__importDefault(require("./mixins/helpers")); var arrow_1 = tslib_1.__importDefault(require("./arrow")); var track_1 = tslib_1.__importDefault(require("./track")); var dots_1 = tslib_1.__importDefault(require("./dots")); /** * Slider inner */ var noop = util_1.func.noop; var InnerSlider = /** @class */ (function (_super) { tslib_1.__extends(InnerSlider, _super); function InnerSlider(props) { var _this = _super.call(this, props) || this; _this.hasMounted = false; _this.state = { animating: false, dragging: false, autoPlayTimer: null, currentDirection: 0, currentLeft: null, currentSlide: 'activeIndex' in props ? props.activeIndex : props.defaultActiveIndex, direction: 1, listWidth: null, listHeight: null, slideCount: null, slideWidth: null, slideHeight: null, slideHeightList: [], swipeLeft: null, touchObject: { startX: 0, startY: 0, curX: 0, curY: 0, }, lazyLoadedList: [], // added for react initialized: false, edgeDragged: false, swiped: false, // used by swipeEvent. differentites between touch and swipe. trackStyle: {}, trackWidth: 0, }; util_1.func.bindCtx(_this, [ 'onWindowResized', 'selectHandler', 'changeSlide', 'onInnerSliderEnter', 'onInnerSliderLeave', 'swipeStart', 'swipeMove', 'swipeEnd', ]); return _this; } InnerSlider.getDerivedStateFromProps = function (nextProps, prevState) { var state = {}; var lazyLoad = nextProps.lazyLoad, children = nextProps.children, slidesToShow = nextProps.slidesToShow; var currentSlide = prevState.currentSlide; var lazyLoadedList = []; if (children !== prevState.children) { state.children = children; state.slideCount = react_1.default.Children.count(children); } if (lazyLoad) { for (var i = 0, j = react_1.default.Children.count(children); i < j; i++) { if (i >= currentSlide && i < currentSlide + slidesToShow) { lazyLoadedList.push(i); var pre = i - 1 < 0 ? j - 1 : i - 1; var next = i + 1 >= j ? 0 : i + 1; lazyLoadedList.push(pre); lazyLoadedList.push(next); } } if (prevState.lazyLoadedList.length === 0) { state.lazyLoadedList = lazyLoadedList; } } return state; }; InnerSlider.prototype.componentDidMount = function () { this.hasMounted = true; // TODO Hack for autoplay -- Inspect Later this.initialize(this.props); this.adaptHeight(); if (this.props.activeIndex) { this.slickGoTo(this.props.activeIndex); } if (window) { // To support server-side rendering util_1.events.on(window, 'resize', this.onWindowResized); } }; InnerSlider.prototype.componentDidUpdate = function (prevProps, prevState) { var _this = this; if (prevProps.activeIndex !== this.props.activeIndex) { this.slickGoTo(this.props.activeIndex); } else if (prevState.currentSlide >= this.props.children.length) { this.update(this.props); this.changeSlide({ message: 'index', index: this.props.children.length - this.props.slidesToShow, currentSlide: this.state.currentSlide, }); } else { var diffKeys_1 = []; Object.keys(prevProps).forEach(function (key) { if (key in _this.props && prevProps[key] !== _this.props[key]) { diffKeys_1.push(key); } }); // children 每次都会不同,所以不需要检测 if (diffKeys_1.every(function (key) { return key === 'children' || typeof _this.props[key] === 'function'; })) { // do nothing; } else { var update = !util_1.obj.shallowEqual(prevProps, this.props); if (update) { this.update(this.props); } } } this.adaptHeight(); }; InnerSlider.prototype.componentWillUnmount = function () { if (this.animationEndCallback) { clearTimeout(this.animationEndCallback); } util_1.events.off(window, 'resize', this.onWindowResized); if (this.state.autoPlayTimer) { clearInterval(this.state.autoPlayTimer); } }; InnerSlider.prototype.onWindowResized = function () { this.update(this.props); // animating state should be cleared while resizing, otherwise autoplay stops working this.setState({ animating: false }); clearTimeout(this.animationEndCallback); delete this.animationEndCallback; }; InnerSlider.prototype.slickGoTo = function (slide) { typeof slide === 'number' && this.changeSlide({ message: 'index', index: slide, currentSlide: this.state.currentSlide, }); }; InnerSlider.prototype.onEnterArrow = function (msg) { this.arrowHoverHandler(msg); }; InnerSlider.prototype.onLeaveArrow = function () { this.arrowHoverHandler(); }; InnerSlider.prototype._instanceRefHandler = function (attr, ref) { this[attr] = ref; }; InnerSlider.prototype.render = function () { var _a = this.props, prefix = _a.prefix, animation = _a.animation, arrows = _a.arrows, arrowSize = _a.arrowSize, arrowPosition = _a.arrowPosition, arrowDirection = _a.arrowDirection, dots = _a.dots, dotsClass = _a.dotsClass, cssEase = _a.cssEase, speed = _a.speed, infinite = _a.infinite, centerMode = _a.centerMode, centerPadding = _a.centerPadding, lazyLoad = _a.lazyLoad, dotsDirection = _a.dotsDirection, rtl = _a.rtl, slidesToShow = _a.slidesToShow, slidesToScroll = _a.slidesToScroll, variableWidth = _a.variableWidth, vertical = _a.vertical, verticalSwiping = _a.verticalSwiping, focusOnSelect = _a.focusOnSelect, children = _a.children, dotsRender = _a.dotsRender, triggerType = _a.triggerType; var _b = this.state, currentSlide = _b.currentSlide, lazyLoadedList = _b.lazyLoadedList, slideCount = _b.slideCount, slideWidth = _b.slideWidth, slideHeight = _b.slideHeight, trackStyle = _b.trackStyle, listHeight = _b.listHeight, dragging = _b.dragging; // TODO 需要精简一下 var trackProps = { prefix: prefix, animation: animation, cssEase: cssEase, speed: speed, infinite: infinite, centerMode: centerMode, focusOnSelect: focusOnSelect ? this.selectHandler : null, currentSlide: currentSlide, lazyLoad: lazyLoad, lazyLoadedList: lazyLoadedList, rtl: rtl, slideWidth: slideWidth, slideHeight: slideHeight, slidesToShow: slidesToShow, slidesToScroll: slidesToScroll, slideCount: slideCount, trackStyle: trackStyle, variableWidth: variableWidth, vertical: vertical, verticalSwiping: verticalSwiping, triggerType: triggerType, }; var dotsEle; if (dots === true && slideCount > slidesToShow) { var dotProps = { prefix: prefix, rtl: rtl, dotsClass: dotsClass, slideCount: slideCount, slidesToShow: slidesToShow, currentSlide: currentSlide, slidesToScroll: slidesToScroll, dotsDirection: dotsDirection, changeSlide: this.changeSlide, dotsRender: dotsRender, triggerType: triggerType, }; dotsEle = react_1.default.createElement(dots_1.default, tslib_1.__assign({}, dotProps)); } var prevArrow, nextArrow; var arrowProps = { prefix: prefix, rtl: rtl, arrowSize: arrowSize, arrowPosition: arrowPosition, arrowDirection: arrowDirection, infinite: infinite, centerMode: centerMode, currentSlide: currentSlide, slideCount: slideCount, slidesToShow: slidesToShow, clickHandler: this.changeSlide, }; if (arrows) { prevArrow = (react_1.default.createElement(arrow_1.default, tslib_1.__assign({}, arrowProps, { type: "prev", "aria-label": "Previous", ref: this._instanceRefHandler.bind(this, 'pArrow'), onMouseEnter: animation ? this.onEnterArrow.bind(this, 'prev') : noop, onMouseLeave: animation ? this.onLeaveArrow.bind(this, 'prev') : noop }), this.props.prevArrow)); nextArrow = (react_1.default.createElement(arrow_1.default, tslib_1.__assign({}, arrowProps, { type: "next", "aria-label": "Next", ref: this._instanceRefHandler.bind(this, 'nArrow'), onMouseEnter: animation ? this.onEnterArrow.bind(this, 'next') : noop, onMouseLeave: animation ? this.onLeaveArrow.bind(this, 'next') : noop }), this.props.nextArrow)); } var verticalHeightStyle = vertical ? { height: listHeight, } : null; var centerPaddingStyle; if (centerMode) { centerPaddingStyle = vertical ? { padding: "".concat(centerPadding, " 0px") } : { padding: "0px ".concat(centerPadding) }; } return (react_1.default.createElement("div", { className: "".concat(prefix, "slick-container ").concat(prefix, "slick-initialized"), onMouseEnter: this.onInnerSliderEnter, onMouseLeave: this.onInnerSliderLeave }, react_1.default.createElement("div", { ref: this._instanceRefHandler.bind(this, 'list'), className: "".concat(prefix, "slick-list"), style: tslib_1.__assign(tslib_1.__assign({}, verticalHeightStyle), centerPaddingStyle), onMouseDown: this.swipeStart, onMouseUp: this.swipeEnd, onTouchStart: this.swipeStart, onTouchEnd: this.swipeEnd, onMouseMove: dragging ? this.swipeMove : undefined, onMouseLeave: dragging ? this.swipeEnd : undefined, onTouchMove: dragging ? this.swipeMove : undefined, onTouchCancel: dragging ? this.swipeEnd : undefined }, react_1.default.createElement(track_1.default, tslib_1.__assign({ ref: this._instanceRefHandler.bind(this, 'track') }, trackProps), children)), prevArrow, nextArrow, dotsEle)); }; InnerSlider.propTypes = { prefix: prop_types_1.default.string, animation: prop_types_1.default.oneOfType([prop_types_1.default.string, prop_types_1.default.bool]), arrows: prop_types_1.default.bool, arrowSize: prop_types_1.default.oneOf(['medium', 'large']), arrowPosition: prop_types_1.default.oneOf(['inner', 'outer']), arrowDirection: prop_types_1.default.oneOf(['hoz', 'ver']), centerPadding: prop_types_1.default.any, children: prop_types_1.default.any, centerMode: prop_types_1.default.bool, dots: prop_types_1.default.bool, dotsDirection: prop_types_1.default.oneOf(['hoz', 'ver']), dotsClass: prop_types_1.default.string, focusOnSelect: prop_types_1.default.bool, cssEase: prop_types_1.default.string, speed: prop_types_1.default.number, infinite: prop_types_1.default.bool, defaultActiveIndex: prop_types_1.default.number, rtl: prop_types_1.default.bool, slidesToShow: prop_types_1.default.number, lazyLoad: prop_types_1.default.bool, activeIndex: prop_types_1.default.number, slidesToScroll: prop_types_1.default.number, variableWidth: prop_types_1.default.bool, vertical: prop_types_1.default.bool, verticalSwiping: prop_types_1.default.bool, prevArrow: prop_types_1.default.element, nextArrow: prop_types_1.default.element, dotsRender: prop_types_1.default.func, triggerType: prop_types_1.default.string, }; InnerSlider.defaultProps = { prefix: 'next-', arrowDirection: 'hoz', triggerType: 'click', }; return InnerSlider; }(react_1.Component)); // extend prototype Object.assign(InnerSlider.prototype, helpers_1.default); Object.assign(InnerSlider.prototype, event_handlers_1.default); exports.default = (0, react_lifecycles_compat_1.polyfill)(InnerSlider);