Skip to content

Commit 9c4d2e1

Browse files
authored
Merge pull request #179 from k2snowman69/k2snowman69/scrollParentAsFunction
Moved custom scroll parent to a function prop
2 parents 253abf2 + d203514 commit 9c4d2e1

File tree

4 files changed

+42
-30
lines changed

4 files changed

+42
-30
lines changed

README.md

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,20 @@ import InfiniteScroll from 'react-infinite-scroller';
6161
You can define a custom `parentNode` element to base the scroll calulations on.
6262

6363
```
64-
class InfiniteScrollOverride extends InfiniteScroll {
65-
66-
/**
67-
* We are overriding the getParentElement function to use a custom element as the scrollable element
68-
*
69-
* @param {any} el the scroller domNode
70-
* @returns {any} the parentNode to base the scroll calulations on
71-
*
72-
* @memberOf InfiniteScrollOverride
73-
*/
74-
getParentElement(el) {
75-
if (this.props.scrollParent) {
76-
return this.props.scrollParent;
77-
}
78-
return super.getParentElement(el);
79-
}
80-
81-
render() {
82-
return super.render();
83-
}
84-
}
64+
<div style="height:700px;overflow:auto;" ref={(ref) => this.scrollParentRef = ref}>
65+
<div>
66+
<InfiniteScroll
67+
pageStart={0}
68+
loadMore={loadFunc}
69+
hasMore={true || false}
70+
loader={<div className="loader" key={0}>Loading ...</div>}
71+
useWindow={false}
72+
getScrollParent={() => this.scrollParentRef}
73+
>
74+
{items}
75+
</InfiniteScroll>
76+
</div>
77+
</div>
8578
```
8679

8780
## Props
@@ -95,6 +88,7 @@ class InfiniteScrollOverride extends InfiniteScroll {
9588
| `loadMore`       | `Function`   |           | A callback when more items are requested by the user. Receives a single parameter specifying the page to load e.g. `function handleLoadMore(page) { /* load more items here */ }` }|
9689
| `loader` | `Component` | | A React component to render while more items are loading. The parent component must have a unique key prop. |
9790
| `pageStart` | `Number` | `0` | The number of the first page to load, With the default of `0`, the first page is `1`.|
91+
| `getScrollParent` | `Function`| | Override method to return a different scroll listener if not the immediate parent. |
9892
| `threshold` | `Number` | `250` | The distance in pixels before the end of the items that will trigger a call to `loadMore`.|
9993
| `useCapture` | `Boolean` | `false` | Proxy to the `useCapture` option of the added event listeners.|
10094
| `useWindow` | `Boolean` | `true` | Add scroll listeners to the window, or else, the component's `parentNode`.|

dist/InfiniteScroll.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ var InfiniteScroll = (function(_Component) {
166166
{
167167
key: 'getParentElement',
168168
value: function getParentElement(el) {
169+
var scrollParent =
170+
this.props.getScrollParent && this.props.getScrollParent();
171+
if (scrollParent != null) {
172+
return scrollParent;
173+
}
169174
return el && el.parentNode;
170175
},
171176
},
@@ -178,16 +183,15 @@ var InfiniteScroll = (function(_Component) {
178183
{
179184
key: 'attachScrollListener',
180185
value: function attachScrollListener() {
181-
if (
182-
!this.props.hasMore ||
183-
!this.getParentElement(this.scrollComponent)
184-
) {
186+
var parentElement = this.getParentElement(this.scrollComponent);
187+
188+
if (!this.props.hasMore || !parentElement) {
185189
return;
186190
}
187191

188192
var scrollEl = window;
189193
if (this.props.useWindow === false) {
190-
scrollEl = this.getParentElement(this.scrollComponent);
194+
scrollEl = parentElement;
191195
}
192196

193197
scrollEl.addEventListener(
@@ -305,6 +309,7 @@ var InfiniteScroll = (function(_Component) {
305309
threshold = renderProps.threshold,
306310
useCapture = renderProps.useCapture,
307311
useWindow = renderProps.useWindow,
312+
getScrollParent = renderProps.getScrollParent,
308313
props = _objectWithoutProperties(renderProps, [
309314
'children',
310315
'element',
@@ -318,6 +323,7 @@ var InfiniteScroll = (function(_Component) {
318323
'threshold',
319324
'useCapture',
320325
'useWindow',
326+
'getScrollParent',
321327
]);
322328

323329
props.ref = function(node) {
@@ -357,6 +363,7 @@ InfiniteScroll.propTypes = {
357363
loadMore: _propTypes2.default.func.isRequired,
358364
pageStart: _propTypes2.default.number,
359365
ref: _propTypes2.default.func,
366+
getScrollParent: _propTypes2.default.func,
360367
threshold: _propTypes2.default.number,
361368
useCapture: _propTypes2.default.bool,
362369
useWindow: _propTypes2.default.bool,
@@ -372,6 +379,7 @@ InfiniteScroll.defaultProps = {
372379
isReverse: false,
373380
useCapture: false,
374381
loader: null,
382+
getScrollParent: null,
375383
};
376384
exports.default = InfiniteScroll;
377385
module.exports = exports['default'];

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-infinite-scroller",
3-
"version": "1.2.1",
3+
"version": "1.2.2",
44
"description": "Infinite scroll component for React in ES6",
55
"main": "index.js",
66
"jsnext:main": "src/InfiniteScroll.js",
@@ -72,4 +72,4 @@
7272
"sinon": "^2.1.0",
7373
"webpack": "^2.5.1"
7474
}
75-
}
75+
}

src/InfiniteScroll.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default class InfiniteScroll extends Component {
1212
loadMore: PropTypes.func.isRequired,
1313
pageStart: PropTypes.number,
1414
ref: PropTypes.func,
15+
getScrollParent: PropTypes.func,
1516
threshold: PropTypes.number,
1617
useCapture: PropTypes.bool,
1718
useWindow: PropTypes.bool,
@@ -28,6 +29,7 @@ export default class InfiniteScroll extends Component {
2829
isReverse: false,
2930
useCapture: false,
3031
loader: null,
32+
getScrollParent: null,
3133
};
3234

3335
constructor(props) {
@@ -87,6 +89,11 @@ export default class InfiniteScroll extends Component {
8789
}
8890

8991
getParentElement(el) {
92+
const scrollParent =
93+
this.props.getScrollParent && this.props.getScrollParent();
94+
if (scrollParent != null) {
95+
return scrollParent;
96+
}
9097
return el && el.parentNode;
9198
}
9299

@@ -95,13 +102,15 @@ export default class InfiniteScroll extends Component {
95102
}
96103

97104
attachScrollListener() {
98-
if (!this.props.hasMore || !this.getParentElement(this.scrollComponent)) {
105+
const parentElement = this.getParentElement(this.scrollComponent);
106+
107+
if (!this.props.hasMore || !parentElement) {
99108
return;
100109
}
101110

102111
let scrollEl = window;
103112
if (this.props.useWindow === false) {
104-
scrollEl = this.getParentElement(this.scrollComponent);
113+
scrollEl = parentElement;
105114
}
106115

107116
scrollEl.addEventListener(
@@ -203,6 +212,7 @@ export default class InfiniteScroll extends Component {
203212
threshold,
204213
useCapture,
205214
useWindow,
215+
getScrollParent,
206216
...props
207217
} = renderProps;
208218

0 commit comments

Comments
 (0)