Skip to content

Commit 78047bd

Browse files
committed
Add throttle/debounce
1 parent 9833d85 commit 78047bd

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,9 @@
5353
"bugs": {
5454
"url": "https://github.com/Aljullu/react-lazy-load-image-component/issues"
5555
},
56-
"homepage": "https://github.com/Aljullu/react-lazy-load-image-component#readme"
56+
"homepage": "https://github.com/Aljullu/react-lazy-load-image-component#readme",
57+
"dependencies": {
58+
"lodash.debounce": "^4.0.8",
59+
"lodash.throttle": "^4.1.1"
60+
}
5761
}

src/components/LazyLoadImage.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,22 @@ class LazyLoadImage extends React.Component {
88
}
99

1010
render() {
11-
const { afterLoad, beforeLoad, placeholder, scrollPosition, threshold,
12-
visibleByDefault, ...imgProps } = this.props;
11+
const { afterLoad, beforeLoad, delayMethod, delayTime, placeholder,
12+
scrollPosition, threshold, visibleByDefault, ...imgProps } = this.props;
1313

1414
return (
1515
<LazyLoadComponent
1616
afterLoad={afterLoad}
1717
beforeLoad={beforeLoad}
1818
className={this.props.className}
19+
delayMethod={delayMethod}
20+
delayTime={delayTime}
1921
height={this.props.height}
2022
placeholder={placeholder}
2123
scrollPosition={scrollPosition}
24+
style={this.props.style}
2225
threshold={threshold}
2326
visibleByDefault={visibleByDefault}
24-
style={this.props.style}
2527
width={this.props.width}>
2628
<img {...imgProps} />
2729
</LazyLoadComponent>

src/components/LazyLoadImage.spec.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ describe('LazyLoadImage', function() {
1818
const props = {
1919
afterLoad: () => null,
2020
beforeLoad: () => null,
21+
delayMethod: 'debounce',
22+
delayTime: 600,
2123
placeholder: null,
2224
scrollPosition: {x: 0, y: 0},
2325
style: {},
@@ -28,6 +30,8 @@ describe('LazyLoadImage', function() {
2830
<LazyLoadImage
2931
afterLoad={props.afterLoad}
3032
beforeLoad={props.beforeLoad}
33+
delayMethod={props.delayMethod}
34+
delayTime={props.delayTime}
3135
placeholder={props.placeholder}
3236
scrollPosition={props.scrollPosition}
3337
src={props.src}
@@ -40,6 +44,8 @@ describe('LazyLoadImage', function() {
4044

4145
expect(lazyLoadComponent.props.afterLoad).toEqual(props.afterLoad);
4246
expect(lazyLoadComponent.props.beforeLoad).toEqual(props.beforeLoad);
47+
expect(lazyLoadComponent.props.delayMethod).toEqual(props.delayMethod);
48+
expect(lazyLoadComponent.props.delayTime).toEqual(props.delayTime);
4349
expect(lazyLoadComponent.props.placeholder).toEqual(props.placeholder);
4450
expect(lazyLoadComponent.props.scrollPosition).toEqual(props.scrollPosition);
4551
expect(lazyLoadComponent.props.style).toEqual(props.style);

src/hoc/trackWindowScroll.js

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
import React from 'react';
2+
import { PropTypes } from 'prop-types';
3+
import debounce from 'lodash.debounce';
4+
import throttle from 'lodash.throttle';
25

36
const trackWindowScroll = (BaseComponent) => {
47
class ScrollAwareComponent extends React.Component {
58
constructor(props) {
69
super(props);
710

11+
const onChangeScroll = this.onChangeScroll.bind(this);
12+
13+
if (props.delayMethod === 'debounce') {
14+
this.delayedScroll = debounce(onChangeScroll, props.delayTime);
15+
} else if (props.delayMethod === 'throttle') {
16+
this.delayedScroll = throttle(onChangeScroll, props.delayTime);
17+
}
18+
819
this.state = {
920
scrollPosition: {
1021
x: window.scrollX || window.pageXOffset,
@@ -14,13 +25,13 @@ const trackWindowScroll = (BaseComponent) => {
1425
}
1526

1627
componentDidMount() {
17-
window.addEventListener('scroll', this.onChangeScroll.bind(this));
18-
window.addEventListener('resize', this.onChangeScroll.bind(this));
28+
window.addEventListener('scroll', this.delayedScroll);
29+
window.addEventListener('resize', this.delayedScroll);
1930
}
2031

2132
componentWillUnmount() {
22-
window.removeEventListener('scroll', this.onChangeScroll.bind(this));
23-
window.removeEventListener('resize', this.onChangeScroll.bind(this));
33+
window.removeEventListener('scroll', this.delayedScroll);
34+
window.removeEventListener('resize', this.delayedScroll);
2435
}
2536

2637
onChangeScroll() {
@@ -33,14 +44,26 @@ const trackWindowScroll = (BaseComponent) => {
3344
}
3445

3546
render() {
47+
const { delayMethod, delayTime, ...props } = this.props;
48+
3649
return (
3750
<BaseComponent
3851
scrollPosition={this.state.scrollPosition}
39-
{...this.props} />
52+
{...props} />
4053
);
4154
}
4255
}
4356

57+
ScrollAwareComponent.propTypes = {
58+
delayMethod: PropTypes.oneOf(['debounce', 'throttle']),
59+
delayTime: PropTypes.number
60+
};
61+
62+
ScrollAwareComponent.defaultProps = {
63+
delayMethod: 'throttle',
64+
delayTime: 300
65+
};
66+
4467
return ScrollAwareComponent;
4568
};
4669

0 commit comments

Comments
 (0)