在开发移动端react项目中,遇到了上拉加载更多数据的分页功能,自己封装了一个组件,供大家参考,写的不好还请多多指教!
import React, {Component} from 'react'; import cssModuleHandler from "../../../utils/cssModuleHandler"; import styleObject from './LoadMore.scss'; const GSV = cssModuleHandler(styleObject); class LoadMore extends Component { constructor(props) { super(props); } componentDidMount() { const loadMoreFn = this.props.loadMoreFn; const callback = () => { if (this.getScrollTop() + this.getWindowHeight() + 100 > this.getScrollHeight()) { loadMoreFn(); } } //滚动事件 let timeAction; window.addEventListener('scroll', () => { if (this.props.isLoadingMore) { return; } if (timeAction) { clearTimeout(timeAction); } timeAction = setTimeout(callback, 50); }); } //滚动条在Y轴上的滚动距离 getScrollTop() { let scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0; if (document.body) { bodyScrollTop = document.body.scrollTop; } if (document.documentElement) { documentScrollTop = document.documentElement.scrollTop; } scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop; return scrollTop; } //文档的总高度 getScrollHeight() { let scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0; if (document.body) { bodyScrollHeight = document.body.scrollHeight; } if (document.documentElement) { documentScrollHeight = document.documentElement.scrollHeight; } scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight; return scrollHeight; } //浏览器视口的高度 getWindowHeight() { let windowHeight = 0; if (document.compatMode == "CSS1Compat") { windowHeight = document.documentElement.clientHeight; } else { windowHeight = document.body.clientHeight; } return windowHeight; } render() { return ( <React.Fragment> {this.props.isLoadingMore ? <div className={GSV('loadMore')} ref='wrapper'><img src={require('../../../static/img/common/ic/spinner.png')} alt=""/></div> : ''} </React.Fragment> ) } } export default LoadMore;
在需要分页的组件中引入LoadMore组件:
import React, {Component} from 'reactimport {observer, inject} from "mobx-react";import {InputItem} from 'antd-mobile'; import LoadMore from "../../../../../components/Commoncomponent/LoadMore/LoadMore"; import PrizeList from "./view/PrizeList/PrizeList"; import cssModuleHandler from "../../../utils/cssModuleHandler"; import styleObject from './index.scss'; const GSV = cssModuleHandler(styleObject); @inject("commonAction", "commonStore", "giftCouponStore", "giftCouponAction") @observer class GiftCoupon extends Component { constructor(props) { super(props); this.pageNo = 0; this.itemPerPage = 200; } componentDidMount() { //初始化数据 this.loadMoreFn(); } //加载更多 loadMoreFn = () => { this.pageNo++; this.props.giftCouponAction.queryBonusListPage({ pageNo: this.pageNo, itemPerPage: this.itemPerPage }); } render() { const {giftCouponList, isLoadingMore} = this.props.giftCouponStore; return ( <div className={GSV('otherGiftCouponWrapper')}> { giftCouponList.length > 0 && {/*礼券列表*/} <PrizeList giftCouponAction={this.props.giftCouponAction} data={giftCouponList} loadMoreFn={this.loadMoreFn} isLoadingMore={isLoadingMore} /> } {/*加载更多*/} <LoadMore loadMoreFn={loadMoreFn} isLoadingMore={isLoadingMore}/> </div> ) } } export default GiftCoupon;