Umi中使用PullToRefresh下拉刷新,InfiniteScroll上拉加载,FloatButton回到顶部

视频效果

上拉加载,下拉刷新,回到顶部

PullToRefresh下拉刷新

// 原始数据
	const list: any = [{ name: 'A' }, { name: 'B' }, { name: 'C' }, { name: 'D' }, { name: 'E' }, { name: 'F' }, { name: 'G' }, { name: 'H' }, { name: 'I' }, { name: 'J' }, { name: 'K' }, { name: 'L' }, { name: 'M' }, { name: 'N' }, { name: 'O' }, { name: 'P' }, { name: 'Q' }, { name: 1 }, { name: 2 }, { name: 3 }, { name: 4 }, { name: 5 }, { name: 2 }, { name: 6 }, { name: 7 }, { name: 8 }, { name: 9 }, { name: 10 }, { name: 11 }, { name: 12 }]
	// 拷贝一份数据做初始化数据
	const data = list
	// 数据进行分页,首页从0开始
	const [page, setPage] = useState(0)
	// 初始数据
	const [rest, setRest] = useState(data.slice(0, 12))
	// InfiniteScroll中是否还有更多内容
	const [hasMore, setHasMore] = useState(true)
	// 触发加载事件的滚动触底距离阈值,单位为像素,默认为250
	const [threshold, setthreshold] = useState(300)
	// 加载更多的回调函数
	async function loadMore() {
		// 拷贝一份数据
		const res = list
		// 触底后页数+1
		const pages = page + 1
		// 每次分页后得到的数据
		const append = res.slice(12 * pages, pages * 12 + 12)
		// 如果超出可分页数返回
		if (pages > Math.ceil(res.length / 12) - 1) {
			return false
		}
		// 更新页数
		setPage(pages)
		// 更新滚动触底距离阈值
		setthreshold(threshold + 300)
		// 设置定时器
		let timer = setInterval(() => {
			// 如何有数据追加数据
			setHasMore(append.length > 0)
			// 更新数据
			setRest((val:any) => [...val, ...append])
			// 销毁定时器
			clearInterval(timer)
		}, 3000)
		// 设置无数据
		setHasMore(false)
	}

InfiniteScroll上拉加载,FloatButton回到顶部

<div style={{ backgroundColor: 'pink', height: '100%', width: '100vw', marginBottom: '50px' }}>
			{/* 下拉刷新 */}
			<PullToRefresh
				onRefresh={async () => {
					// 设置等待时间
					await sleep(1000)
					// 拷贝一份数据
					const data = list
					// 将页数重新设置为0
					setPage(0)
					// 刷新后的初始化数据
					const ret: any = data.slice(0, 12)
					// 更新数据
					setRest([...ret])
				}}
			>
				{/* 长列表 数据渲染 */}
				<List>
					{rest.map((item:any, index:any) => (
						<List.Item key={index} style={{ height: '60px' }}>{item.name}</List.Item>
					))}
				</List>
				{/* 回到顶部 */}
				<FloatButton.BackTop />
			</PullToRefresh>
			{/* 上拉加载 */}
			<InfiniteScroll loadMore={loadMore} hasMore={hasMore} threshold={threshold}>
				{!hasMore ?
					<div>
						<span>Loading</span>
						<DotLoading />
					</div>
					:
					<span>--- 我是有底线的 ---</span>
				}
			</InfiniteScroll>
		</div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果您在 umi 使用了 ProLayout 组件,但是路由菜单没有加载出来,可能是因为您没有正确配置路由信息。 请确保您在 umirc 正确配置了路由信息,并在路由配置包含了需要显示的菜单项。在 ProLayout 组件,需要使用 menuData 属性来传递菜单数据。您可以在路由配置添加 icon 和 name 等属性,然后在 menuData 使用这些属性来显示菜单项。 以下是一个示例路由配置: ```javascript export default [ { path: '/', component: '@/layouts/ProLayout', routes: [ { path: '/home', name: '首页', icon: 'smile', component: '@/pages/Home', }, { path: '/about', name: '关于我们', icon: 'info-circle', component: '@/pages/About', }, ], }, ]; ``` 在 ProLayout 组件,您需要使用 menuData 属性将路由信息传递给菜单组件。示例如下: ```javascript import ProLayout, { MenuDataItem } from '@ant-design/pro-layout'; import { useIntl, Link } from 'umi'; const BasicLayout: React.FC = (props) => { const { formatMessage } = useIntl(); return ( <ProLayout menuDataRender={(menuData: MenuDataItem[]) => menuData} menuItemRender={(item, dom) => ( <Link to={item.path}>{dom}</Link> )} > {props.children} </ProLayout> ); }; export default BasicLayout; ``` 在上述示例,我们使用了 menuDataRender 属性来直接将路由配置传递给菜单组件。如果您需要对路由信息进行进一步处理,也可以在该属性进行处理后再传递给菜单组件。在 menuItemRender ,我们使用 Link 组件将菜单项转换为链接,从而实现点击菜单项后跳转到对应的页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚时之秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值