From c705f11b7e5f74bbcfac8ccdf1a0c2b88ab249d5 Mon Sep 17 00:00:00 2001 From: srgooglo Date: Mon, 6 Jun 2022 10:29:42 +0200 Subject: [PATCH] refactor to use functional component --- .../app/src/components/LoadMore/index.jsx | 109 ++++++++---------- 1 file changed, 47 insertions(+), 62 deletions(-) diff --git a/packages/app/src/components/LoadMore/index.jsx b/packages/app/src/components/LoadMore/index.jsx index eac1b28e..8f52330c 100644 --- a/packages/app/src/components/LoadMore/index.jsx +++ b/packages/app/src/components/LoadMore/index.jsx @@ -1,39 +1,22 @@ import React from "react" -import PropTypes from "prop-types" import classnames from "classnames" import IntersectionObserver from "intersection-observer-polyfill" import "./index.less" -export default class LoadMore extends React.Component { - constructor() { - super(...arguments) - this.insideViewportCb = this.insideViewportCb.bind(this) - } +export default React.forwardRef((props, ref) => { + const { + className, + children, + hasMore, + loadingComponent, + noResultComponent, + } = props - static propTypes = { - onBottom: PropTypes.func, - fetching: PropTypes.bool, - hasMore: PropTypes.bool, - NoResult: PropTypes.func, - Footer: PropTypes.func - } + let observer = null - componentDidMount() { - try { - const node = document.getElementById("bottom") - - this.observer = new IntersectionObserver(this.insideViewportCb) - this.observer.observe(node) - } catch (err) { - console.log("err in finding node", err) - } - - window.addEventListener("scroll", this.handleOnScroll) - } - - insideViewportCb(entries) { - const { fetching, onBottom } = this.props + const insideViewportCb = (entries) => { + const { fetching, onBottom } = props entries.forEach(element => { if (element.intersectionRatio > 0 && !fetching) { @@ -42,41 +25,43 @@ export default class LoadMore extends React.Component { }) } - componentWillUnmount() { - if (this.observer) { - this.observer = null + React.useEffect(() => { + try { + const node = document.getElementById("bottom") + + observer = new IntersectionObserver(insideViewportCb) + observer.observe(node) + } catch (err) { + console.log("err in finding node", err) } - } - render() { - const { - className, - children, - hasMore, - loadingComponent, - noResultComponent, - } = this.props + return () => { + observer = null + } + }, []) - return
-
- {children} -
- -
- -
- {loadingComponent && React.createElement(loadingComponent)} -
- -
- {noResultComponent ? React.createElement(noResultComponent) : "No more result"} -
+ return
+
+ {children}
- } -} \ No newline at end of file + +
+ +
+ {loadingComponent && React.createElement(loadingComponent)} +
+ +
+ {noResultComponent ? React.createElement(noResultComponent) : "No more result"} +
+
+}) \ No newline at end of file