UNPKG

15.1 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
10
11var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
12
13var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
14
15var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
16
17var _inherits2 = require('babel-runtime/helpers/inherits');
18
19var _inherits3 = _interopRequireDefault(_inherits2);
20
21var _class, _temp;
22
23var _react = require('react');
24
25var _react2 = _interopRequireDefault(_react);
26
27var _propTypes = require('prop-types');
28
29var _propTypes2 = _interopRequireDefault(_propTypes);
30
31var _reactLifecyclesCompat = require('react-lifecycles-compat');
32
33var _util = require('../../util');
34
35var _eventHandlers = require('./mixins/event-handlers');
36
37var _eventHandlers2 = _interopRequireDefault(_eventHandlers);
38
39var _helpers = require('./mixins/helpers');
40
41var _helpers2 = _interopRequireDefault(_helpers);
42
43var _arrow = require('./arrow');
44
45var _arrow2 = _interopRequireDefault(_arrow);
46
47var _track = require('./track');
48
49var _track2 = _interopRequireDefault(_track);
50
51var _dots = require('./dots');
52
53var _dots2 = _interopRequireDefault(_dots);
54
55function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
56
57/**
58 * Slider inner
59 */
60
61var noop = _util.func.noop;
62var InnerSlider = (_temp = _class = function (_React$Component) {
63 (0, _inherits3.default)(InnerSlider, _React$Component);
64
65 function InnerSlider(props) {
66 (0, _classCallCheck3.default)(this, InnerSlider);
67
68 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props));
69
70 _this.state = {
71 animating: false,
72 dragging: false,
73 autoPlayTimer: null,
74 currentDirection: 0,
75 currentLeft: null,
76 currentSlide: 'activeIndex' in props ? props.activeIndex : props.defaultActiveIndex,
77 direction: 1,
78 listWidth: null,
79 listHeight: null,
80 slideCount: null,
81 slideWidth: null,
82 slideHeight: null,
83 swipeLeft: null,
84 touchObject: {
85 startX: 0,
86 startY: 0,
87 curX: 0,
88 curY: 0
89 },
90
91 lazyLoadedList: [],
92
93 // added for react
94 initialized: false,
95 edgeDragged: false,
96 swiped: false, // used by swipeEvent. differentites between touch and swipe.
97 trackStyle: {},
98 trackWidth: 0
99 };
100
101 // this.filterProps = Object.assign({}, sliderPropTypes, InnerSlider.propTypes);
102
103 _util.func.bindCtx(_this, ['onWindowResized', 'selectHandler', 'changeSlide', 'onInnerSliderEnter', 'onInnerSliderLeave', 'swipeStart', 'swipeMove', 'swipeEnd']);
104 return _this;
105 }
106
107 InnerSlider.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {
108 var state = {};
109
110 var lazyLoad = nextProps.lazyLoad,
111 children = nextProps.children,
112 slidesToShow = nextProps.slidesToShow,
113 activeIndex = nextProps.activeIndex;
114 var currentSlide = prevState.currentSlide;
115
116 var lazyLoadedList = [];
117
118 if (children !== prevState.children) {
119 state.children = children;
120 }
121
122 if (lazyLoad) {
123 for (var i = 0, j = _react2.default.Children.count(children); i < j; i++) {
124 if (i >= currentSlide && i < currentSlide + slidesToShow) {
125 lazyLoadedList.push(i);
126
127 var pre = i - 1 < 0 ? j - 1 : i - 1;
128 var next = i + 1 >= j ? 0 : i + 1;
129
130 lazyLoadedList.push(pre);
131 lazyLoadedList.push(next);
132 }
133 }
134
135 if (prevState.lazyLoadedList.length === 0) {
136 state.lazyLoadedList = lazyLoadedList;
137 }
138 }
139
140 return state;
141 };
142
143 InnerSlider.prototype.componentDidMount = function componentDidMount() {
144 this.hasMounted = true;
145
146 // TODO Hack for autoplay -- Inspect Later
147 this.initialize(this.props);
148 this.adaptHeight();
149
150 if (this.props.activeIndex) {
151 this.slickGoTo(this.props.activeIndex);
152 }
153
154 /* istanbul ignore if */
155 if (window) {
156 // To support server-side rendering
157 _util.events.on(window, 'resize', this.onWindowResized);
158 }
159 };
160
161 InnerSlider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {
162 if (prevProps.activeIndex !== this.props.activeIndex) {
163 this.slickGoTo(this.props.activeIndex);
164 } else if (prevState.currentSlide >= this.props.children.length) {
165 this.update(this.props);
166 this.changeSlide({
167 message: 'index',
168 index: this.props.children.length - this.props.slidesToShow,
169 currentSlide: this.state.currentSlide
170 });
171 } else {
172 var update = !_util.obj.shallowEqual(prevProps, this.props);
173 if (update) {
174 this.update(this.props);
175 }
176 }
177
178 this.adaptHeight();
179 };
180
181 InnerSlider.prototype.componentWillUnmount = function componentWillUnmount() {
182 if (this.animationEndCallback) {
183 clearTimeout(this.animationEndCallback);
184 }
185
186 _util.events.off(window, 'resize', this.onWindowResized);
187
188 if (this.state.autoPlayTimer) {
189 clearInterval(this.state.autoPlayTimer);
190 }
191 };
192
193 InnerSlider.prototype.onWindowResized = function onWindowResized() {
194 this.update(this.props);
195 // animating state should be cleared while resizing, otherwise autoplay stops working
196 this.setState({ animating: false });
197 clearTimeout(this.animationEndCallback);
198 delete this.animationEndCallback;
199 };
200
201 InnerSlider.prototype.slickGoTo = function slickGoTo(slide) {
202 typeof slide === 'number' && this.changeSlide({
203 message: 'index',
204 index: slide,
205 currentSlide: this.state.currentSlide
206 });
207 };
208
209 InnerSlider.prototype.onEnterArrow = function onEnterArrow(msg) {
210 this.arrowHoverHandler(msg);
211 };
212
213 InnerSlider.prototype.onLeaveArrow = function onLeaveArrow() {
214 this.arrowHoverHandler();
215 };
216
217 InnerSlider.prototype._instanceRefHandler = function _instanceRefHandler(attr, ref) {
218 this[attr] = ref;
219 };
220
221 InnerSlider.prototype.render = function render() {
222 var _props = this.props,
223 prefix = _props.prefix,
224 animation = _props.animation,
225 arrows = _props.arrows,
226 arrowSize = _props.arrowSize,
227 arrowPosition = _props.arrowPosition,
228 arrowDirection = _props.arrowDirection,
229 dots = _props.dots,
230 dotsClass = _props.dotsClass,
231 cssEase = _props.cssEase,
232 speed = _props.speed,
233 infinite = _props.infinite,
234 centerMode = _props.centerMode,
235 centerPadding = _props.centerPadding,
236 lazyLoad = _props.lazyLoad,
237 dotsDirection = _props.dotsDirection,
238 rtl = _props.rtl,
239 slidesToShow = _props.slidesToShow,
240 slidesToScroll = _props.slidesToScroll,
241 variableWidth = _props.variableWidth,
242 vertical = _props.vertical,
243 verticalSwiping = _props.verticalSwiping,
244 focusOnSelect = _props.focusOnSelect,
245 children = _props.children,
246 dotsRender = _props.dotsRender,
247 triggerType = _props.triggerType;
248 var _state = this.state,
249 currentSlide = _state.currentSlide,
250 lazyLoadedList = _state.lazyLoadedList,
251 slideCount = _state.slideCount,
252 slideWidth = _state.slideWidth,
253 slideHeight = _state.slideHeight,
254 trackStyle = _state.trackStyle,
255 listHeight = _state.listHeight,
256 dragging = _state.dragging;
257
258 // TODO 需要精简一下
259
260 var trackProps = {
261 prefix: prefix,
262 animation: animation,
263 cssEase: cssEase,
264 speed: speed,
265 infinite: infinite,
266 centerMode: centerMode,
267 focusOnSelect: focusOnSelect ? this.selectHandler : null,
268 currentSlide: currentSlide,
269 lazyLoad: lazyLoad,
270 lazyLoadedList: lazyLoadedList,
271 rtl: rtl,
272 slideWidth: slideWidth,
273 slideHeight: slideHeight,
274 slidesToShow: slidesToShow,
275 slidesToScroll: slidesToScroll,
276 slideCount: slideCount,
277 trackStyle: trackStyle,
278 variableWidth: variableWidth,
279 vertical: vertical,
280 verticalSwiping: verticalSwiping,
281 triggerType: triggerType
282 // clickHandler: this.changeSlide, unused
283 };
284
285 var dotsEle = void 0;
286
287 if (dots === true && slideCount > slidesToShow) {
288 var dotProps = {
289 prefix: prefix,
290 rtl: rtl,
291 dotsClass: dotsClass,
292 slideCount: slideCount,
293 slidesToShow: slidesToShow,
294 currentSlide: currentSlide,
295 slidesToScroll: slidesToScroll,
296 dotsDirection: dotsDirection,
297 changeSlide: this.changeSlide,
298 dotsRender: dotsRender,
299 triggerType: triggerType
300 };
301
302 dotsEle = _react2.default.createElement(_dots2.default, dotProps);
303 }
304
305 var prevArrow = void 0,
306 nextArrow = void 0;
307
308 var arrowProps = {
309 prefix: prefix,
310 rtl: rtl,
311 arrowSize: arrowSize,
312 arrowPosition: arrowPosition,
313 arrowDirection: arrowDirection,
314 infinite: infinite,
315 centerMode: centerMode,
316 currentSlide: currentSlide,
317 slideCount: slideCount,
318 slidesToShow: slidesToShow,
319 clickHandler: this.changeSlide
320 };
321
322 if (arrows) {
323 prevArrow = _react2.default.createElement(
324 _arrow2.default,
325 (0, _extends3.default)({}, arrowProps, {
326 type: 'prev',
327 'aria-label': 'Previous',
328 ref: this._instanceRefHandler.bind(this, 'pArrow'),
329 onMouseEnter: animation ? this.onEnterArrow.bind(this, 'prev') : noop,
330 onMouseLeave: animation ? this.onLeaveArrow.bind(this, 'prev') : noop
331 }),
332 this.props.prevArrow
333 );
334
335 nextArrow = _react2.default.createElement(
336 _arrow2.default,
337 (0, _extends3.default)({}, arrowProps, {
338 type: 'next',
339 'aria-label': 'Next',
340 ref: this._instanceRefHandler.bind(this, 'nArrow'),
341 onMouseEnter: animation ? this.onEnterArrow.bind(this, 'next') : noop,
342 onMouseLeave: animation ? this.onLeaveArrow.bind(this, 'next') : noop
343 }),
344 this.props.nextArrow
345 );
346 }
347
348 var verticalHeightStyle = vertical ? {
349 height: listHeight
350 } : null;
351
352 var centerPaddingStyle = void 0;
353 if (centerMode) {
354 centerPaddingStyle = vertical ? { padding: centerPadding + ' 0px' } : { padding: '0px ' + centerPadding };
355 }
356
357 return _react2.default.createElement(
358 'div',
359 {
360 className: prefix + 'slick-container ' + prefix + 'slick-initialized',
361 onMouseEnter: this.onInnerSliderEnter,
362 onMouseLeave: this.onInnerSliderLeave
363 },
364 _react2.default.createElement(
365 'div',
366 {
367 ref: this._instanceRefHandler.bind(this, 'list'),
368 className: prefix + 'slick-list',
369 style: (0, _extends3.default)({}, verticalHeightStyle, centerPaddingStyle),
370 onMouseDown: this.swipeStart,
371 onMouseUp: this.swipeEnd,
372 onTouchStart: this.swipeStart,
373 onTouchEnd: this.swipeEnd,
374 onMouseMove: dragging ? this.swipeMove : null,
375 onMouseLeave: dragging ? this.swipeEnd : null,
376 onTouchMove: dragging ? this.swipeMove : null,
377 onTouchCancel: dragging ? this.swipeEnd : null
378 },
379 _react2.default.createElement(
380 _track2.default,
381 (0, _extends3.default)({ ref: this._instanceRefHandler.bind(this, 'track') }, trackProps),
382 children
383 )
384 ),
385 prevArrow,
386 nextArrow,
387 dotsEle
388 );
389 };
390
391 return InnerSlider;
392}(_react2.default.Component), _class.propTypes = {
393 prefix: _propTypes2.default.string,
394 animation: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.bool]),
395 arrows: _propTypes2.default.bool,
396 arrowSize: _propTypes2.default.oneOf(['medium', 'large']),
397 arrowPosition: _propTypes2.default.oneOf(['inner', 'outer']),
398 arrowDirection: _propTypes2.default.oneOf(['hoz', 'ver']),
399 centerPadding: _propTypes2.default.any,
400 children: _propTypes2.default.any,
401 centerMode: _propTypes2.default.bool,
402 dots: _propTypes2.default.bool,
403 dotsDirection: _propTypes2.default.oneOf(['hoz', 'ver']),
404 dotsClass: _propTypes2.default.string,
405 focusOnSelect: _propTypes2.default.bool,
406 cssEase: _propTypes2.default.string,
407 speed: _propTypes2.default.number,
408 infinite: _propTypes2.default.bool,
409 defaultActiveIndex: _propTypes2.default.number,
410 rtl: _propTypes2.default.bool,
411 slidesToShow: _propTypes2.default.number,
412 lazyLoad: _propTypes2.default.bool,
413 activeIndex: _propTypes2.default.number,
414 slidesToScroll: _propTypes2.default.number,
415 variableWidth: _propTypes2.default.bool,
416 vertical: _propTypes2.default.bool,
417 verticalSwiping: _propTypes2.default.bool,
418 prevArrow: _propTypes2.default.element,
419 nextArrow: _propTypes2.default.element,
420 dotsRender: _propTypes2.default.func,
421 triggerType: _propTypes2.default.string
422}, _class.defaultProps = {
423 prefix: 'next-',
424 arrowDirection: 'hoz',
425 triggerType: 'click'
426}, _temp);
427
428// extend prototype
429
430InnerSlider.displayName = 'InnerSlider';
431(0, _extends3.default)(InnerSlider.prototype, _helpers2.default);
432(0, _extends3.default)(InnerSlider.prototype, _eventHandlers2.default);
433
434exports.default = (0, _reactLifecyclesCompat.polyfill)(InnerSlider);
435module.exports = exports['default'];
\No newline at end of file