Skip to content

Commit 13abc56

Browse files
authored
Merge pull request #1873 from akiran/0.27.9
0.27.9
2 parents 43bd164 + 1c3d70c commit 13abc56

File tree

9 files changed

+106
-59
lines changed

9 files changed

+106
-59
lines changed

docs/single-demo.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import React from "react";
44
import ReactDOM from "react-dom";
55
import Slider from "../src/slider";
6-
76
function SimpleSlider() {
87
const settings = {
98
dots: true,

examples/Fade.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ export default class Fade extends Component {
1010
infinite: true,
1111
speed: 500,
1212
slidesToShow: 1,
13-
slidesToScroll: 1
13+
slidesToScroll: 1,
14+
waitForAnimate: false
1415
};
1516
return (
1617
<div>

examples/__tests__/Fade.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React from "react";
2+
import { mount } from "enzyme";
3+
import Fade from "../Fade";
4+
import { clickNext, clickPrev } from "../../__tests__/testUtils";
5+
6+
describe("Fade", () => {
7+
it("should change slides when clicked on next & prev buttons", () => {
8+
const slider = mount(<Fade />);
9+
let activeSlide = slider.find("div.slick-active");
10+
expect(activeSlide.props()["data-index"]).toEqual(0);
11+
clickNext(slider);
12+
activeSlide = slider.find("div.slick-active");
13+
expect(activeSlide.props()["data-index"]).toEqual(1);
14+
clickPrev(slider);
15+
activeSlide = slider.find("div.slick-active");
16+
expect(activeSlide.props()["data-index"]).toEqual(0);
17+
});
18+
});

examples/__tests__/__snapshots__/MultipleItems.test.js.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ exports[`Multiple Items should show slides first 3 slides when middle dot is cli
989989
<h2> Multiple items </h2>
990990
<div class=\\"slick-slider slick-initialized\\" dir=\\"ltr\\"><button type=\\"button\\" data-role=\\"none\\" class=\\"slick-arrow slick-prev\\" style=\\"display: block;\\"> Previous</button>
991991
<div class=\\"slick-list\\">
992-
<div class=\\"slick-track\\" style=\\"opacity: 1; transform: translate3d(0px, 0px, 0px);\\">
992+
<div class=\\"slick-track\\" style=\\"opacity: 1; transform: translate3d(0px, 0px, 0px); transition: transform 500ms ease;\\">
993993
<div data-index=\\"-3\\" tabindex=\\"-1\\" class=\\"slick-slide slick-cloned\\" aria-hidden=\\"true\\" style=\\"width: 0px;\\">
994994
<div>
995995
<div tabindex=\\"-1\\" style=\\"width: 100%; display: inline-block;\\">

examples/__tests__/__snapshots__/UnevenSets.test.js.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ exports[`UnevenSets Finite Activity test 1`] = `
5151
</div>
5252
</div><button type=\\"button\\" data-role=\\"none\\" class=\\"slick-arrow slick-next slick-disabled\\" style=\\"display: block;\\"> Next</button>
5353
<ul style=\\"display: block;\\" class=\\"slick-dots\\">
54-
<li class=\\"slick-active\\"><button>1</button></li>
55-
<li class=\\"\\"><button>2</button></li>
54+
<li class=\\"\\"><button>1</button></li>
55+
<li class=\\"slick-active\\"><button>2</button></li>
5656
</ul>
5757
</div>
5858
</div>"

src/dots.js

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import React from "react";
44
import classnames from "classnames";
5+
import { clamp } from "./utils/innerSliderUtils";
56

67
const getDotCount = spec => {
78
let dots;
@@ -25,47 +26,55 @@ export class Dots extends React.PureComponent {
2526
this.props.clickHandler(options);
2627
}
2728
render() {
29+
const {
30+
onMouseEnter,
31+
onMouseOver,
32+
onMouseLeave,
33+
infinite,
34+
slidesToScroll,
35+
slidesToShow,
36+
slideCount,
37+
currentSlide
38+
} = this.props;
2839
let dotCount = getDotCount({
29-
slideCount: this.props.slideCount,
30-
slidesToScroll: this.props.slidesToScroll,
31-
slidesToShow: this.props.slidesToShow,
32-
infinite: this.props.infinite
40+
slideCount,
41+
slidesToScroll,
42+
slidesToShow,
43+
infinite
3344
});
3445

35-
// Apply join & split to Array to pre-fill it for IE8
36-
//
37-
// Credit: http://stackoverflow.com/a/13735425/1849458
38-
const { onMouseEnter, onMouseOver, onMouseLeave } = this.props;
3946
const mouseEvents = { onMouseEnter, onMouseOver, onMouseLeave };
40-
let dots = Array.apply(
41-
null,
42-
Array(dotCount + 1)
43-
.join("0")
44-
.split("")
45-
).map((x, i) => {
46-
let leftBound = i * this.props.slidesToScroll;
47-
let rightBound =
48-
i * this.props.slidesToScroll + (this.props.slidesToScroll - 1);
47+
let dots = [];
48+
for (let i = 0; i < dotCount; i++) {
49+
let _rightBound = (i + 1) * slidesToScroll - 1;
50+
let rightBound = infinite
51+
? _rightBound
52+
: clamp(_rightBound, 0, slideCount - 1);
53+
let _leftBound = rightBound - (slidesToScroll - 1);
54+
let leftBound = infinite
55+
? _leftBound
56+
: clamp(_leftBound, 0, slideCount - 1);
57+
4958
let className = classnames({
50-
"slick-active":
51-
this.props.currentSlide >= leftBound &&
52-
this.props.currentSlide <= rightBound
59+
"slick-active": infinite
60+
? currentSlide >= leftBound && currentSlide <= rightBound
61+
: currentSlide === leftBound
5362
});
5463

5564
let dotOptions = {
5665
message: "dots",
5766
index: i,
58-
slidesToScroll: this.props.slidesToScroll,
59-
currentSlide: this.props.currentSlide
67+
slidesToScroll,
68+
currentSlide
6069
};
6170

6271
let onClick = this.clickHandler.bind(this, dotOptions);
63-
return (
72+
dots = dots.concat(
6473
<li key={i} className={className}>
6574
{React.cloneElement(this.props.customPaging(i), { onClick })}
6675
</li>
6776
);
68-
});
77+
}
6978

7079
return React.cloneElement(this.props.appendDots(dots), {
7180
className: this.props.dotsClass,

src/inner-slider.js

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -122,47 +122,33 @@ export class InnerSlider extends React.Component {
122122
}
123123
this.ro.disconnect();
124124
};
125-
UNSAFE_componentWillReceiveProps = nextProps => {
126-
let spec = {
127-
listRef: this.list,
128-
trackRef: this.track,
129-
...nextProps,
130-
...this.state
131-
};
125+
126+
didPropsChange(prevProps) {
132127
let setTrackStyle = false;
133128
for (let key of Object.keys(this.props)) {
134-
if (!nextProps.hasOwnProperty(key)) {
129+
if (!prevProps.hasOwnProperty(key)) {
135130
setTrackStyle = true;
136131
break;
137132
}
138133
if (
139-
typeof nextProps[key] === "object" ||
140-
typeof nextProps[key] === "function"
134+
typeof prevProps[key] === "object" ||
135+
typeof prevProps[key] === "function"
141136
) {
142137
continue;
143138
}
144-
if (nextProps[key] !== this.props[key]) {
139+
if (prevProps[key] !== this.props[key]) {
145140
setTrackStyle = true;
146141
break;
147142
}
148143
}
149-
this.updateState(spec, setTrackStyle, () => {
150-
if (this.state.currentSlide >= React.Children.count(nextProps.children)) {
151-
this.changeSlide({
152-
message: "index",
153-
index:
154-
React.Children.count(nextProps.children) - nextProps.slidesToShow,
155-
currentSlide: this.state.currentSlide
156-
});
157-
}
158-
if (nextProps.autoplay) {
159-
this.autoPlay("update");
160-
} else {
161-
this.pause("paused");
162-
}
163-
});
164-
};
165-
componentDidUpdate = () => {
144+
return (
145+
setTrackStyle ||
146+
React.Children.count(this.props.children) !==
147+
React.Children.count(prevProps.children)
148+
);
149+
}
150+
151+
componentDidUpdate = prevProps => {
166152
this.checkImagesLoad();
167153
this.props.onReInit && this.props.onReInit();
168154
if (this.props.lazyLoad) {
@@ -183,6 +169,32 @@ export class InnerSlider extends React.Component {
183169
// this.props.onLazyLoad([leftMostSlide])
184170
// }
185171
this.adaptHeight();
172+
let spec = {
173+
listRef: this.list,
174+
trackRef: this.track,
175+
...this.props,
176+
...this.state
177+
};
178+
const setTrackStyle = this.didPropsChange(prevProps);
179+
setTrackStyle &&
180+
this.updateState(spec, setTrackStyle, () => {
181+
if (
182+
this.state.currentSlide >= React.Children.count(this.props.children)
183+
) {
184+
this.changeSlide({
185+
message: "index",
186+
index:
187+
React.Children.count(this.props.children) -
188+
this.props.slidesToShow,
189+
currentSlide: this.state.currentSlide
190+
});
191+
}
192+
if (this.props.autoplay) {
193+
this.autoPlay("update");
194+
} else {
195+
this.pause("paused");
196+
}
197+
});
186198
};
187199
onWindowResized = setTrackStyle => {
188200
if (this.debouncedResize) this.debouncedResize.cancel();
@@ -385,6 +397,8 @@ export class InnerSlider extends React.Component {
385397
onLazyLoad && slidesToLoad.length > 0 && onLazyLoad(slidesToLoad);
386398
if (!this.props.waitForAnimate && this.animationEndCallback) {
387399
clearTimeout(this.animationEndCallback);
400+
afterChange && afterChange(currentSlide);
401+
delete this.animationEndCallback;
388402
}
389403
this.setState(state, () => {
390404
// asNavForIndex check is to avoid recursive calls of slideHandler in waitForAnimate=false mode
@@ -408,7 +422,6 @@ export class InnerSlider extends React.Component {
408422
changeSlide = (options, dontAnimate = false) => {
409423
const spec = { ...this.props, ...this.state };
410424
let targetSlide = changeSlide(spec, options);
411-
if (targetSlide === this.state.targetSlide) return;
412425
if (targetSlide !== 0 && !targetSlide) return;
413426
if (dontAnimate === true) {
414427
this.slideHandler(targetSlide, dontAnimate);

src/track.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const getSlideStyle = spec => {
6767
style.left = -spec.index * parseInt(spec.slideWidth);
6868
}
6969
style.opacity = spec.currentSlide === spec.index ? 1 : 0;
70-
if (!spec.useCSS) {
70+
if (spec.useCSS) {
7171
style.transition =
7272
"opacity " +
7373
spec.speed +

src/utils/innerSliderUtils.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ export const changeSlide = (spec, options) => {
259259
slidesToShow,
260260
slideCount,
261261
currentSlide,
262+
targetSlide: previousTargetSlide,
262263
lazyLoad,
263264
infinite
264265
} = spec;
@@ -273,13 +274,19 @@ export const changeSlide = (spec, options) => {
273274
previousInt = currentSlide - slideOffset;
274275
targetSlide = previousInt === -1 ? slideCount - 1 : previousInt;
275276
}
277+
if (!infinite) {
278+
targetSlide = previousTargetSlide - slidesToScroll;
279+
}
276280
} else if (options.message === "next") {
277281
slideOffset = indexOffset === 0 ? slidesToScroll : indexOffset;
278282
targetSlide = currentSlide + slideOffset;
279283
if (lazyLoad && !infinite) {
280284
targetSlide =
281285
((currentSlide + slidesToScroll) % slideCount) + indexOffset;
282286
}
287+
if (!infinite) {
288+
targetSlide = previousTargetSlide + slidesToScroll;
289+
}
283290
} else if (options.message === "dots") {
284291
// Click on dots
285292
targetSlide = options.index * options.slidesToScroll;

0 commit comments

Comments
 (0)