当前位置: 首页 > article >正文

触底加载上拉刷新

上拉: 

import React, { useState } from 'react';

function Shangla() {
  const [refreshing, setRefreshing] = useState(false);
  const [startY, setStartY] = useState(0);
  const [offsetY, setOffsetY] = useState(0);
  const [scrollY, setScrollY] = useState(0);

  const handleTouchStart = (e) => {
    // 记录触摸起始位置和滚动高度
    const touchStartY = e.touches[0].clientY;
    const scrollY = e.currentTarget.scrollTop;
    setStartY(touchStartY);
    setScrollY(scrollY);
  };

  const handleTouchMove = (e) => {
    // 计算手指移动距离
    const touchMoveY = e.touches[0].clientY;
    let delta = touchMoveY - startY;

    // 当手指向下滑动,并且在页面顶部时触发下拉效果
    if (delta > 0 && scrollY === 0) {
      // e.preventDefault(); // 阻止整个页面的滚动
      delta = delta > 50 ? 50 : delta
      setOffsetY(delta);
    }
  };

  const handleTouchEnd = () => {
    // 当滑动距离超过一定阈值时触发刷新
    if (offsetY > 30) {
      setRefreshing(true);
      setStartY(30);
      setOffsetY(30);
      // 执行刷新逻辑...
      // 刷新完成后重置状态
      setTimeout(() => {
        setRefreshing(false);
        setStartY(0);
        setOffsetY(0);
        setScrollY(0);
        window.scrollTo(0, 0); // 滚动到顶部
      }, 1000);
    } else {
      setStartY(0);
      setOffsetY(0);
    }
  };

  return (
    <div
      style={{ height: '100vh', overflow: 'scroll' }}
      onTouchStart={handleTouchStart}
      onTouchMove={handleTouchMove}
      onTouchEnd={handleTouchEnd}
    >
      <div
        style={{
          transform: `translate3d(0, ${offsetY}px, 0)`,
          transition:'transform 0.5s',
          textAlign: 'center',
          marginTop: '-22px'
        }}
      >
        {refreshing ? 'Refreshing...' : 'Pull down to refresh'}
       
      </div>
      {/* 商品列表 */}
      <ul style={{
          transform: `translate3d(0, ${offsetY}px, 0)`,
          transition: 'transform 0.5s',
          textAlign: 'center',
          margin: '0'
        }}>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>
          <li>100</li>

        </ul>
    </div>
  );
}

export default Shangla;

触底:

import React, { useState, useEffect } from "react";

function Chudi() {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    // 模拟从服务器获取数据的操作
    fetchData();
  }, []);

  // 模拟从服务器获取数据的函数
  const fetchData = () => {
    setLoading(true);

    // 模拟异步请求
    setTimeout(() => {
      const newData = [...data, ...getMoreData()];
      setData(newData);
      setLoading(false);
    }, 2000);
  };

  // 模拟获取更多数据的函数
  const getMoreData = () => {
    // 返回一些新数据
    return [1, 2, 3, 4, 5,6,7,8,9,10];
  };

  // 处理滚动事件
  const handleScroll = (e) => {
    const { scrollTop, clientHeight, scrollHeight } = e.target;

    if (scrollTop + clientHeight  >= scrollHeight) {
      // 到达底部,执行上拉刷新操作
      fetchData();
    }
  };

  return (
    <div style={{ height: "150px", overflow: "auto" }} onScroll={handleScroll}>
      <ul >
        {data.map((item, index) => (
          <li key={index}>{item}</li>
        ))}
      </ul>
      <div style={{height: '30px',background: 'green'}}>
      {loading && <p>Loading...</p >}
      </div>
      
    </div>
  );
}

export default Chudi;


http://www.kler.cn/a/152070.html

相关文章:

  • CentOS 7安装Java 8
  • Linux 系统渗透提权-Server2204
  • flink消费kafka限制消费速率
  • 【ARM CoreLink 系列 8.1 -- SMMU 详细介绍-STE Entry 详细介绍 1】
  • 通用plantuml模板头
  • Spring三级缓存处理循环依赖的过程
  • 10.30 作业 C++
  • 【NGINX--10】高可用性部署模式
  • 万户ezOFFICE wpsservlet任意文件上传漏洞复现
  • centos7配置tomcat
  • 阅读文献总结2023
  • CTA-GAN:基于生成对抗性网络的主动脉和颈动脉非集中CT血管造影 CT到增强CT的合成技术
  • MySQL 大表设计
  • Echarts 柱状图添加标记 最大值 最小值 平均值
  • 【开题报告】基于SpringBoot的在线打印预约系统的设计与实现
  • 学习笔记:Pytorch 搭建自己的Faster-RCNN目标检测平台
  • 【双向链表的实现】
  • JS设计模式 — 行为委托
  • 基于php的求书网的设计与实现
  • 【Vulnhub 靶场】【DriftingBlues: 9 (final)】【简单】【20210509】