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

苹果系统H5下拉加载事件重复触发(react hooks)

文章目录

  • 问题描述
  • 解决思路
  • 引发的问题
  • 优化后的代码


问题描述

ios端手机下的h5/小程序,滚动到底部时加载更多数据,但是滚动到底部时重复触发加载事件,在安卓机下则不会发生该问题,记录一下解决方案。


解决思路

为了防止下拉事件重复触发,对下拉事件做一次防抖处理:

import { useState, useRef, useCallback } from 'react';
import debounce from 'lodash/debounce';

const paramPageRef = useRef(1)
const [searchResult, setSearchResult] = useState([]);


  // 防抖查询
  const debounceSearch = useCallback(
    debounce(() => handleSearch (), 300),
    [],
  );
  
 // 接口查询数据
 const handleSearch = async () => {
    const params = {
    	// 一些参数
      county: selectedArea.regionName,
      address: searchKey,
      ...stableParams,
      currentPage: paramPageRef.current,

    };
    try {
      const res = await fuzzySearchByPage(params);
      console.log('addressSearch---response-->', res);
      if (res.currentPage === 1) {
        setSearchResult(res?.records || []);
      } else {     
        setSearchResult([...searchResult, ...res?.records]);
      }   
      setHasMore(res.hasMore )
      paramPageRef.current += 1
    } catch (err) {
      console.error('handleSearch----err--->', err);

    }
  };

 <ScrollRefresh
      down={false}
      pull={false}
      Lower={() => {
          if (hasMore) {
            debounceSearch(data)
           }     
          ;
        }}
     / >

引发的问题

以上代码解决了重复触发下拉到底的问题,但是使用useCallBack的防抖会形成闭包,导致在 handleSearch 方法中取不到最新的 searchResult, 从而加载更多时会少加载前一页的数据,为了防止这个闭包问题,可以通过设置一个新的state,,通过监听这个state触发handleSearch方法。

优化后的代码

import { useState, useRef, useCallback } from 'react';
import debounce from 'lodash/debounce';

const paramPageRef = useRef(1)
const [searchResult, setSearchResult] = useState([]);
const [page, setPage] = useState(1);



  // 防抖查询
  const debounceSearch = useCallback(
    debounce(() => setPage(paramPageRef.current), 300),
    [],
  );
  
  useEffect(()=>{
    console.log(page)
    if (page !==1 ) {
      handleSearch()
    }
  },[page])
  
  
 // 接口查询数据
 const handleSearch = async () => {
    const params = {
    	// 一些参数
      county: selectedArea.regionName,
      address: searchKey,
      ...stableParams,
      currentPage: paramPageRef.current,
    };
    try {
      const res = await fuzzySearchByPage(params);
      console.log('addressSearch---response-->', res);
      if (res.currentPage === 1) {
        setSearchResult(res?.records || []);
      } else {     
        setSearchResult([...searchResult, ...res?.records]);
      }   
      setHasMore(res.hasMore )
      paramPageRef.current += 1
    } catch (err) {
      console.error('handleSearch----err--->', err);

    }
  };

 <ScrollRefresh
      down={false}
      pull={false}
      Lower={() => {
          if (hasMore) {
            debounceSearch()
           }     
          ;
        }}
     / >

如此便可以正常请求了,下拉事件在300毫秒内只会触发一次。


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

相关文章:

  • 笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)
  • 2024年低压电工证考试题库及低压电工试题解析
  • R语言基础入门详解
  • MongoDB聚合操作
  • CC工具箱使用指南:【CAD导出界址点Excel】
  • web应用安全和信息泄露预防
  • JVM 类的加载子系统
  • 基于springboot实现网吧管理系统项目【项目源码+论文说明】计算机毕业设计
  • 这是一个lonely的问题——二进制
  • python和Springboot如何交互?
  • C++快速幂(递归)
  • elementui时间日期组件右边自定义图标
  • VS工程的“多dll与exe文件合并”
  • DevOps持续集成-Jenkins(4)
  • leetcode 146. LRU 缓存
  • (react+ts)vite项目中的路径别名的配置
  • 共享WiFi贴推广项目怎么操作?
  • el-select multiple表单校验问题
  • 「译文」深入了解Kubernetes和Nomad
  • 【嵌入式】HC32F07X ADC采样及软件滤波
  • Uniapp中嵌入H5( uniapp开发的H5),并且在H5中跳转到APP的指定页面
  • 【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解
  • 外网访问|SD-WAN跨境网络专线助力企业摆脱网络困境
  • UnrealSynth - 基于虚幻引擎的YOLO合成数据生成器
  • Redis快速上手篇五(持久化)
  • GZ035 5G组网与运维赛题第1套