在data.d.ts中定义父组件所需要传的值

import { ReactNode } from 'react'
type PullStatus = 'pulling' | 'canRelease' | 'refreshing' | 'complete'
interface InfiniteProps {isNavBar?: boolean // 是否有头部TopNoData?: number // 无数据的时候图片距离顶部的距离InitialNoData?: {img: string // 初始进入无数据的图片content: ReactNode | string // 内容区域 可以是文本或者reactNode} // 初始进入无数据传入的searchNoData?: {img: string // 搜索无数据的imgcontent: ReactNode | string // 内容区域 可以是文本或者reactNode} // 搜索无数据的scrollMap: {isNull?: booleanlastPage: boolean | undefinedisLoading: boolean | undefinedsetSize: (num: number) => voidsize: number | undefinedrefresh: (obj?: object) => void} // 传入的滚动组件所需要的值, 这是一个map调用request的时候返回的scrollMapskeletionData?: string // 传入的列表骨架屏图片TopDistance?: number // 滚动组件距离顶部的距离isBottomPadding?: boolean //是否给底部没有数据提示加paddingpageSize?: number // 接受传入的每页的数据量data: Array<[]> // 接收传入的每页的数据height?: number | string // 滚动组件高度 可以传入可以不传backgroundColor?: string | '#fff' // 传入的背景颜色isScrollRecovery?: boolean // 是否执行滚动位置恢复childrenContent?: ReactNode // 内容// eslint-disable-next-line @typescript-eslint/ban-typeshandlerRefresh?: () => void // 触发刷新时的处理函数(可以不用)pullingText?: ReactNode // 下拉的提示文案canReleaseText?: ReactNode // 释放的提示文案refreshingText?: ReactNode // 刷新时的提示文案completeText?: ReactNode // 完成时的提示文案completeDelay?: number // 完成后延迟消失的时间,单位为 msheadHeight?: number // 头部提示内容区的高度,单位为 pxthreshold?: number // 触发刷新需要下拉多少距离,单位为 pxdropText?: (status: PullStatus) => ReactNode // 根据下拉状态,自定义下拉提示文案
}
export { InfiniteProps }

在index.tsx中实现此功能

import React, { useRef, useEffect } from 'react'
import { Main } from './styled'
import { InfiniteProps } from './data'
import { Loading, PullToRefresh, Image } from 'antd-mobile'
import { useLocation } from 'react-router-dom'
import { useInViewport, useSafeState, useUpdateEffect } from 'ahooks'
import { chunk } from 'lodash-es'
// 列表进入详情,从详情返回到列表保留滚动条位置
import { useScrollToRestore } from '@/hooks/scrollToRestore'
import EmptyState from '../EmptyState' // 空状态组件引入const InfiniteScroll: React.FC<InfiniteProps> = (props) => {const {height = 0,data,pageSize = 15,backgroundColor='#ffffff',isNavBar = false,scrollMap,skeletionData = '',TopDistance,isBottomPadding= false,childrenContent,isScrollRecovery= true,handlerRefresh,pullingText = '下拉刷新',canReleaseText = '释放立即刷新',refreshingText = '加载中……',completeText = '刷新成功',completeDelay = 500,headHeight = 40,threshold = 60,TopNoData, // 无数据的时候图片距离顶部的距离InitialNoData, // 初始进入无数据的状态searchNoData, // 搜索无数据的状态} = propsconst {refresh,lastPage,size = 0,isLoading,setSize,isNull,} = scrollMap// 判断是否是显示加载中const [isDisplayLoad, setIsDisplayLoad] = useSafeState(false)// 判断是否是最后一条数据const [isLastData, setIsLastData] = useSafeState(false)// 加载中的refconst loadingRef = useRef<HTMLDivElement>(null)// 监听加载中是否显示到可视窗口const [inViewport] = useInViewport(loadingRef)// 获取当前路由地址const { pathname } = useLocation()// 是否显示出来加载中 如果是true 则加载下一页useUpdateEffect(() => {if (inViewport && setSize) {setSize(size + 1)}}, [inViewport])// 设置是否显示加载中以及判断是否是最后一页useEffect(() => {const displayLoad = data?.length === 0const initData = chunk(data, pageSize)const lastData = displayLoad || (initData && initData[initData.length - 1]?.length < pageSize)setIsLastData(!dataLastPage || lastData )setIsDisplayLoad(displayLoad)}, [data, dataLastPage])// 调用滚动位置恢复hooksuseScrollToRestore(isScroll, 'roolDom')// 底部渲染const handlerBottom = () => {let content = ''if (isDisplayLoad) {content = ''} else if (!isLastData && isDisplayLoad) {content = ''} else {content = '没有更多了~'}return content}return (<><InfiniteMainisNavBar={isNavBar || import.meta.env.MODE.includes('lcoal') }TopDistance={TopDistance}isAddPadding={isBottomPadding}dataNall={data.length === 0}className="roolDom"height={height}backgroundColor={backgroundColor}>{!isLoading ? (<>{/* 初始进来页面无数据 */}{InitialNoData && !isNull && data.length === 0 && (<EmptyStateisNavBar={isNavBar}defaultImg={InitialNoData?.img}top={top || 0}title={InitialNoData?.content|| ''}/>)}{/* 页面有数据 搜索无数据 */}{searchNoData && isNull && data.length === 0 && (<EmptyStateisNavBar={isNavBar}defaultImg={searchNoData?.img}top={TopNoData || 0}title={searchNoData?.content || ''}/>)}<PullToRefreshonRefresh={async () => {await (handlerRefresh && handlerRefresh())refresh && refresh()sessionStorage.removeItem(pathname)}}pullingText={pullingText}canReleaseText={canReleaseText}refreshingText={refreshingText}completeText={completeText}completeDelay={completeDelay}headHeight={headHeight}threshold={threshold}><div className="mainBox">{childrenContent}</div>{!isLastData ? (<div ref={isLoadingRef} className="base_load"><div>加载中</div><Loading /></div>) : (handlerBottom() && <div className="botm">{handlerBottom()}</div>)}</PullToRefresh></>) : (skeletionData && <Image src={skeletionData} />)}</InfiniteMain></>)
}
export default React.memo(InfiniteScroll)

在styled.ts中实现样式

import styled from 'ns-styled'
const InfiniteMain = styled.div<{TopDistance?: numberisAddPadding?: booleanheight: number | stringbackgroundColor?: string | '#fff'dataNall: booleanisNavBar: boolean
}>`background: ${(p) => p.dataNall && '#f5f5f5'};&::-webkit-scrollbar {display: none;}.adm-pull-to-refresh-head-content {font-size: 14px;}.base_load {height: 36px;background: #f7f7f7;font-size: 14px;display: flex;align-items: center;justify-content: center;div {display: inline-block;}}.botm {font-size: 12px;color: #8c8c8c;text-align: center;height: 24px;line-height: 24px;margin-top: 32px;margin-bottom: ${(props) => props.isAddPadding && '56px'};}height: ${(p) =>p.TopDistance? `calc(100vh - ${(p.TopDistance || 0) + (p.isNavBar ? 52 : 0)}px)`: Number(p.height)? `${p.height}px`: p.height};overflow: auto;-webkit-overflow-scrolling: touch;background: ${(props) => props.backgroundColor};
`
export { InfiniteMain }

【react】InfiniteScroll 滚动组件相关推荐

  1. react 数字滚动组件

    效果图 给数字做了逗号符分割,更符合国际大额数字的浏览效果. /** @Descripttion:* @version:* @Author: dal* @Date: 2021-11-02 16:48: ...

  2. 解决Element的 InfiniteScroll 无限滚动组件报错

    问题: 使用Element的 InfiniteScroll 无限滚动组件,代码正常,但是控制台还是会有报错: vue.esm.js?efeb:628 [Vue warn]: Error in dire ...

  3. 使用Element的 InfiniteScroll 无限滚动组件报错

    一.问题描述 在使用Element的InfiniteScroll 无限滚动时候出现以下错误: TypeError: Failed to execute 'observe' on 'MutationOb ...

  4. 【React】手写虚拟滚动组件(二)可自动获取不定高度的虚拟滚动组件

    前言 上次那篇写的虚拟滚动后来使用发现在某些情况并不是特别好用,并且只支持固定高度.我看了下umihook的虚拟滚动,发现也不是很好用,它支持手动设定每个元素高度,但也不能支持不定高度,而且限定更多了 ...

  5. 【ElementUI】InfiniteScroll 无限滚动组件在部分浏览器中滚动失效 的 解决方案

    ElementUI 官网 InfiniteScroll 使用:https://element.eleme.cn/#/zh-CN/component/infiniteScroll 首先先叙述一下需求,说 ...

  6. 数字滚动组件(react)

    基于react实现一个数字滚动组件(vue也一样,逻辑相同) 直接上代码 1.number-roll.tsx interface NumberRollProps {value: number; } c ...

  7. React Native 下载组件以及npm常用命令

    一.React Native 下载组件: RN的组件都是需要从网上下载的.正常来说,我们通过npm start打开服务器之后,直接用npm下载即可.常用的组件,例如按钮,滚动等,都是可以直接下载的.下 ...

  8. react 实现滚动加载_在React中实现平滑滚动

    react 实现滚动加载 Smooth Scrolling, dont know what it is? Well, instead of clicking on a button and being ...

  9. 移动跨平台框架React Native状态栏组件StatusBar【16】

    前端江太公 React Native,是一个混合移动应用开发框架,是目前流行的跨平台移动应用开发框架之一.React Native 采用不同的方法进行混合移动应用开发.它不会生成原生 UI 组件,而是 ...

最新文章

  1. SAP SD 关于信用管理--信用更新
  2. python应用实战案例:python如何实现异步爬虫?
  3. HttpInvoker GET/POST方式
  4. php群发不用foreach,如何在没有foreach的情况下使用PHP生成器?
  5. 【6.2】hibernate_component
  6. 2017c语言 形成性考核,[2017年电大]《c语言程序设计》形成性考核作业()解答.doc...
  7. [转]更改windows 2003远程桌面连接的端口
  8. 傲腾内存linux安装,装机不求人:Intel傲腾内存安装教程
  9. 基于HTML5+JavaScript+CSS3+PHP的网上商城电子商务购物网站设计
  10. bos 获取数据库连接_bos数据库表
  11. ckplayer播放器 直播
  12. git clone报错Could not resolve proxy : proxy-szn
  13. html图片长高如何设置,快速长高的方法 教你一个动作暴长10cm
  14. OLAP和OLTP比较
  15. 微信怎么解绑手机号?手把手教你具体操作步骤
  16. 是谁在偷窥你的手机隐私?
  17. android 逆向入门知识
  18. 下肢静脉血栓——桂枝茯苓丸加四味健步汤
  19. java中double类型占几个字节_java中各种数据类型占用字节数
  20. OpenMediaVault 6.0 组了Raid 5 挂载硬盘失败

热门文章

  1. 使用性能监视器找出SQLServer硬件瓶颈
  2. Linux字符界面字符颜色显示
  3. mysql 加盐_密码加盐
  4. 【非编系统】非编系统是从事影视后期编辑的系统工具
  5. IOS xcodebuild
  6. 微信分享给朋友接口图片问题
  7. 大学生计算机协会举办的比赛和活动,计算机协会“英雄联盟”赛事活动总结
  8. linux下压缩文件解压文件,linux下 解压和压缩文件 rar文件解压
  9. idea快捷键设置自动补全代码
  10. 10 分钟了解 Actor 模型