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

react hook ts 实现 列表的滚动分页加载,多参数混合混合搜索

  • InfiniteScroll 的组件见: https://blog.csdn.net/Zhooson/article/details/134396945

  • search.tsx 页面

import { FC, useEffect, useState } from 'react'
import InfiniteScroll from '../../components/InfiniteScroll'const tabs = [{id: 1,title: 'tab-1',index: '1'},{id: 2,title: 'tab-1',index: '2'}
]const DEFAULT_PAGE = {page: 1,limit: 10,total: 0,hasMore: true
}const MyBook: FC = () => {const [tabIndex, setTabIndex] = useState(0)const [pageOption, setPageOption] = useState(DEFAULT_PAGE)const [list, setList] = useState<any>([])const [keywords, setKeywords] = useState()const [shouldFetch, setShouldFetch] = useState(false) // 是否继续fetchconst [loading, setLoading] = useState(false)// 初始化useEffect(() => {getList()}, [])// 条件搜索useEffect(() => {if (shouldFetch) {getList()}}, [shouldFetch])// 接口获取数据async function getList() {setLoading(true)const { limit, page } = pageOptionconst params = {limit,page,statusIds: tabs[tabIndex].index,keywords}await fetchMyBookList(params).then((res) => {if (!res) returnconst newList = list.concat(res.Data.records)setList(newList)setPageOption((prevPageOption) => ({...prevPageOption,hasMore: newList.length < res.Data.total,total: res.Data.total || 0}))setLoading(false)setShouldFetch(false)}).catch(() => {})}// 加载更多async function loadMore() {setPageOption((prevData) => {// 数据异步更新导致if (prevData.hasMore) {setShouldFetch(true)return { ...prevData, page: prevData.page + 1 }} else {return prevData}})}return (<div><input type="text" placeholder="请输入" /><buttononClick={(e) => {setKeywords(e.detail.value)// 搜索时候需要 重置所有参数,包括分页参数setPageOption(DEFAULT_PAGE)setShouldFetch(true)}}>搜索</button><div>{tabs.map((item, index) => {return (<divkey={index}onClick={() => {setTabIndex(index)setList([])setPageOption(DEFAULT_PAGE)setShouldFetch(true)}}>{item.title}</div>)})}</div>{list.length === 0 && !loading && <div>~暂无数据~</div>}{list.length > 0 && (<div>{list.map((_: any, index: number) => {return <div key={index}>{index}</div>})}</div>)}{list.length > 8 && (<InfiniteScroll loadMore={loadMore} hasMore={pageOption.hasMore} />)}</div>)
}export default MyBook

解释: 1. 当前的hook执行都是异步,会不会存在先执行完先渲染? setTabIndex(index), setList([])
, setPageOption(DEFAULT_PAGE)
, setShouldFetch(true)

在React中,状态更新函数(如setPageOptionsetTabIndexsetShouldFetch)是异步的,
这意味着它们不会立即更新状态。然而,React会保证在同一次事件处理函数中的所有状态更新都在同一次渲染中完成。
这就意味着,在searchHandler函数中,setPageOptionsetTabIndexsetShouldFetch的执行顺序是不确定的,
但是它们的状态更新会在同一次渲染中完成。

  1. 为什么引入 setShouldFetch ?

这个搜索页面的,有多个参数,有的参数改变是立刻fetch一下接口,有的参数改变是要点击按钮才能fetch一下,这样导致你在useEffect无法统一检测搜索参数变化。 故引入 setShouldFetch 这个变量,通过检测setShouldFetch的变化,一旦变化就fetch

相关文章:

  • ctf之流量分析学习
  • 沉浸式航天vr科普馆VR太空主题馆展示
  • Beautiful Soup爬取数据html xml
  • 查询ip地址
  • Java版B/S架构云his医院信息管理系统源码(springboot框架)
  • 0基础学习VR全景平台篇第121篇:认识视频剪辑软件Premiere
  • 酷开系统 酷开科技,将家庭娱乐推向新高潮
  • 为什么LDO一般不用在大电流场景?
  • AWD比赛中的一些防护思路技巧
  • 设计模式 -- 工厂模式(Factory Pattern)
  • es的介绍以及使用
  • vuex使用(如何安装和全局引用可看我的博客Vue的安装以及相关插件)
  • 迈瑞医疗,用科技创新解构医疗器械全球法则
  • VMware 虚拟cpu进入关闭状态 的解决办法
  • 基于STM32的物联网体感控制机械臂
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Linux系统编程】快速查找errno错误码信息
  • Android组件 - 收藏集 - 掘金
  • CSS 提示工具(Tooltip)
  • Django 博客开发教程 16 - 统计文章阅读量
  • java中的hashCode
  • JS变量作用域
  • js写一个简单的选项卡
  • Laravel5.4 Queues队列学习
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 翻译--Thinking in React
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 解决iview多表头动态更改列元素发生的错误
  • 那些被忽略的 JavaScript 数组方法细节
  • 入门到放弃node系列之Hello Word篇
  • Prometheus VS InfluxDB
  • ​520就是要宠粉,你的心头书我买单
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (多级缓存)多级缓存
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (区间dp) (经典例题) 石子合并
  • (十六)串口UART
  • (四) 虚拟摄像头vivi体验
  • (转)jdk与jre的区别
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Sublime Text3配置Lua运行环境
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)程序员疫苗:代码注入
  • (转)负载均衡,回话保持,cookie
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net FrameWork总结
  • .NET 使用 XPath 来读写 XML 文件