原生Js实现上拉加载,下拉刷新

实现效果

原生js上拉加载,下拉刷新

实现代码

import React, { useEffect, useState } from 'react'
import { FloatButton } from 'antd';
export default function shop() {
	useEffect(() => {
		//监听页面的滚动
		window.onscroll = function () {
			//scrollTop是滚动条滚动时,距离顶部的距离
			//为了保证兼容性,这里取两个值,哪个有值取哪一个
			let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
			//windowHeight是可视区的高度
			let windowHeight = document.documentElement.clientHeight || document.body.clientHeight;
			//scrollHeight是滚动条的总高度
			let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;

			// 触底加载
			//滚动条到底部的条件
			if ((scrollTop + windowHeight) >= scrollHeight) {
				//到了这个就可以进行业务逻辑加载后台数据了
				var pages = page + 1
				if (pages > Math.ceil(list.length / 12) - 1) {
					return false
				}
				setPage(pages)
				let timer = setInterval(() => {
					const res = data.slice(pages * 12, pages * 12 + 12)
					setisshow(res.length > 0)
					setRest([...rest, ...res])
					clearInterval(timer)
				}, 3000)
				setisshow(false)
			}
		}
		// 获取dom节点
		var _element: any = document.getElementById('refreshContainer')
		var _refreshText: any = document.querySelector('.refreshText')
		// 监听touchstart
		_element.addEventListener('touchstart', function (e:any) {
			_startPos = e.touches[0].pageY; // 记录初始位置
			_element.style.position = 'relative';
			_element.style.transition = 'transform 0s';
		}, false);
		// 监听touchmove
		_element.addEventListener('touchmove', function (e:any) {
			// e.touches[0].pageY 当前位置
			_transitionHeight = e.touches[0].pageY - _startPos; // 记录差值

			if (_transitionHeight > 0 && _transitionHeight < 60) {
				_refreshText.innerText = '下拉刷新';
				_element.style.transform = 'translateY(' + _transitionHeight + 'px)';

				if (_transitionHeight > 100) {
					_refreshText.innerText = '释放更新';
				}
			}
		}, false);
		// 监听touchend
		_element.addEventListener('touchend', function (e) {
			_element.style.transition = 'transform 0.5s ease 1s';
			_element.style.transform = 'translateY(0px)';
			_refreshText.innerText = '更新中...';
			// 设置定时器
			let timer = setInterval(() => {
				// 拷贝一份数据
				const data = list
				// 将页数重新设置为0
				setPage(0)
				// 刷新后的初始化数据
				const ret: any = data.slice(0, 12)
				// 更新数据
				setRest([...ret])
				setStartPos(0)
				// 销毁定时器
				clearInterval(timer)
				_refreshText.innerText = '';
			}, 3000)
		}, false);
	})
	// 原始数据
	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
	// 数据分页
	const [page, setPage] = useState(0)
	// 初始化数据
	const [rest, setRest] = useState(data.slice(page, 12))
	// 是否显示loading
	const [isshow, setisshow] = useState(false)
	// 下拉初始的值
	var [_startPos, setStartPos]: any = useState(0)
	// 下拉移动的距离
	var _transitionHeight: any = 0;
	return (
		<div style={{ marginBottom: '50px', position: 'relative' }}>
			<p className='refreshText' style={{ backgroundColor: 'green', margin: '0', display: 'flex', justifyContent: 'center' }}></p>
			<div id='refreshContainer' style={{ marginTop: '0' }}>
				<dl>
					{
						rest.map((item: any, index: any) => {
							return <dd key={index} style={{ height: '50px' }}>{item.name}</dd>
						})
					}
				</dl>
				{isshow ?
					<div style={{ height: '50px', backgroundColor: 'green', display: 'flex', justifyContent: 'center', alignContent: 'center', lineHeight: '50px' }}>我也是有低线的。。</div>
					:
					<div style={{ height: '50px', backgroundColor: 'green', display: 'flex', justifyContent: 'center', alignContent: 'center', lineHeight: '50px' }}>正在加载中。。。
					</div>
				}
			</div>
			{/* 回到顶部 */}
			<button style={{ position: 'absolute', backgroundColor: '#fff', height: '50px', width: '50px', border: 'none', borderRadius: '50%', zIndex: '200', bottom: '0', right: '0' }} onClick={() => {
				window.scrollTo(50, 0)
			}}>顶部</button>
		</div>
	)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晚时之秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值