slider.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _json2mq = _interopRequireDefault(require("../_util/json2mq"));
  11. var _BaseMixin = _interopRequireDefault(require("../_util/BaseMixin"));
  12. var _vnode = require("../_util/vnode");
  13. var _innerSlider = _interopRequireDefault(require("./inner-slider"));
  14. var _defaultProps = _interopRequireDefault(require("./default-props"));
  15. var _innerSliderUtils = require("./utils/innerSliderUtils");
  16. var _propsUtil = require("../_util/props-util");
  17. var _default = exports.default = (0, _vue.defineComponent)({
  18. name: 'Slider',
  19. mixins: [_BaseMixin.default],
  20. inheritAttrs: false,
  21. props: (0, _extends2.default)({}, _defaultProps.default),
  22. data() {
  23. this._responsiveMediaHandlers = [];
  24. return {
  25. breakpoint: null
  26. };
  27. },
  28. // handles responsive breakpoints
  29. mounted() {
  30. if (this.responsive) {
  31. const breakpoints = this.responsive.map(breakpt => breakpt.breakpoint);
  32. // sort them in increasing order of their numerical value
  33. breakpoints.sort((x, y) => x - y);
  34. breakpoints.forEach((breakpoint, index) => {
  35. // media query for each breakpoint
  36. let bQuery;
  37. if (index === 0) {
  38. bQuery = (0, _json2mq.default)({
  39. minWidth: 0,
  40. maxWidth: breakpoint
  41. });
  42. } else {
  43. bQuery = (0, _json2mq.default)({
  44. minWidth: breakpoints[index - 1] + 1,
  45. maxWidth: breakpoint
  46. });
  47. }
  48. // when not using server side rendering
  49. (0, _innerSliderUtils.canUseDOM)() && this.media(bQuery, () => {
  50. this.setState({
  51. breakpoint
  52. });
  53. });
  54. });
  55. // Register media query for full screen. Need to support resize from small to large
  56. // convert javascript object to media query string
  57. const query = (0, _json2mq.default)({
  58. minWidth: breakpoints.slice(-1)[0]
  59. });
  60. (0, _innerSliderUtils.canUseDOM)() && this.media(query, () => {
  61. this.setState({
  62. breakpoint: null
  63. });
  64. });
  65. }
  66. },
  67. beforeUnmount() {
  68. this._responsiveMediaHandlers.forEach(function (obj) {
  69. obj.mql.removeListener(obj.listener);
  70. });
  71. },
  72. methods: {
  73. innerSliderRefHandler(ref) {
  74. this.innerSlider = ref;
  75. },
  76. media(query, handler) {
  77. // javascript handler for css media query
  78. const mql = window.matchMedia(query);
  79. const listener = _ref => {
  80. let {
  81. matches
  82. } = _ref;
  83. if (matches) {
  84. handler();
  85. }
  86. };
  87. mql.addListener(listener);
  88. listener(mql);
  89. this._responsiveMediaHandlers.push({
  90. mql,
  91. query,
  92. listener
  93. });
  94. },
  95. slickPrev() {
  96. var _a;
  97. (_a = this.innerSlider) === null || _a === void 0 ? void 0 : _a.slickPrev();
  98. },
  99. slickNext() {
  100. var _a;
  101. (_a = this.innerSlider) === null || _a === void 0 ? void 0 : _a.slickNext();
  102. },
  103. slickGoTo(slide) {
  104. let dontAnimate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  105. var _a;
  106. (_a = this.innerSlider) === null || _a === void 0 ? void 0 : _a.slickGoTo(slide, dontAnimate);
  107. },
  108. slickPause() {
  109. var _a;
  110. (_a = this.innerSlider) === null || _a === void 0 ? void 0 : _a.pause('paused');
  111. },
  112. slickPlay() {
  113. var _a;
  114. (_a = this.innerSlider) === null || _a === void 0 ? void 0 : _a.handleAutoPlay('play');
  115. }
  116. },
  117. render() {
  118. var _a;
  119. let settings;
  120. let newProps;
  121. if (this.breakpoint) {
  122. newProps = this.responsive.filter(resp => resp.breakpoint === this.breakpoint);
  123. settings = newProps[0].settings === 'unslick' ? 'unslick' : (0, _extends2.default)((0, _extends2.default)({}, this.$props), newProps[0].settings);
  124. } else {
  125. settings = (0, _extends2.default)({}, this.$props);
  126. }
  127. // force scrolling by one if centerMode is on
  128. if (settings.centerMode) {
  129. if (settings.slidesToScroll > 1 && process.env.NODE_ENV !== 'production') {
  130. console.warn(`slidesToScroll should be equal to 1 in centerMode, you are using ${settings.slidesToScroll}`);
  131. }
  132. settings.slidesToScroll = 1;
  133. }
  134. // force showing one slide and scrolling by one if the fade mode is on
  135. if (settings.fade) {
  136. if (settings.slidesToShow > 1 && process.env.NODE_ENV !== 'production') {
  137. console.warn(`slidesToShow should be equal to 1 when fade is true, you're using ${settings.slidesToShow}`);
  138. }
  139. if (settings.slidesToScroll > 1 && process.env.NODE_ENV !== 'production') {
  140. console.warn(`slidesToScroll should be equal to 1 when fade is true, you're using ${settings.slidesToScroll}`);
  141. }
  142. settings.slidesToShow = 1;
  143. settings.slidesToScroll = 1;
  144. }
  145. // makes sure that children is an array, even when there is only 1 child
  146. let children = (0, _propsUtil.getSlot)(this) || [];
  147. // Children may contain false or null, so we should filter them
  148. // children may also contain string filled with spaces (in certain cases where we use jsx strings)
  149. children = children.filter(child => {
  150. if (typeof child === 'string') {
  151. return !!child.trim();
  152. }
  153. return !!child;
  154. });
  155. // rows and slidesPerRow logic is handled here
  156. if (settings.variableWidth && (settings.rows > 1 || settings.slidesPerRow > 1)) {
  157. console.warn(`variableWidth is not supported in case of rows > 1 or slidesPerRow > 1`);
  158. settings.variableWidth = false;
  159. }
  160. const newChildren = [];
  161. let currentWidth = null;
  162. for (let i = 0; i < children.length; i += settings.rows * settings.slidesPerRow) {
  163. const newSlide = [];
  164. for (let j = i; j < i + settings.rows * settings.slidesPerRow; j += settings.slidesPerRow) {
  165. const row = [];
  166. for (let k = j; k < j + settings.slidesPerRow; k += 1) {
  167. if (settings.variableWidth && ((_a = children[k].props) === null || _a === void 0 ? void 0 : _a.style)) {
  168. currentWidth = children[k].props.style.width;
  169. }
  170. if (k >= children.length) break;
  171. row.push((0, _vnode.cloneElement)(children[k], {
  172. key: 100 * i + 10 * j + k,
  173. tabindex: -1,
  174. style: {
  175. width: `${100 / settings.slidesPerRow}%`,
  176. display: 'inline-block'
  177. }
  178. }));
  179. }
  180. newSlide.push((0, _vue.createVNode)("div", {
  181. "key": 10 * i + j
  182. }, [row]));
  183. }
  184. if (settings.variableWidth) {
  185. newChildren.push((0, _vue.createVNode)("div", {
  186. "key": i,
  187. "style": {
  188. width: currentWidth
  189. }
  190. }, [newSlide]));
  191. } else {
  192. newChildren.push((0, _vue.createVNode)("div", {
  193. "key": i
  194. }, [newSlide]));
  195. }
  196. }
  197. if (settings === 'unslick') {
  198. const className = 'regular slider ' + (this.className || '');
  199. return (0, _vue.createVNode)("div", {
  200. "class": className
  201. }, [children]);
  202. } else if (newChildren.length <= settings.slidesToShow) {
  203. settings.unslick = true;
  204. }
  205. const sliderProps = (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({}, this.$attrs), settings), {
  206. children: newChildren,
  207. ref: this.innerSliderRefHandler
  208. });
  209. return (0, _vue.createVNode)(_innerSlider.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, sliderProps), {}, {
  210. "__propsSymbol__": []
  211. }), this.$slots);
  212. }
  213. });