slider.js 7.9 KB

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