0803分頁_加載更多-網絡ajax請求2-react-仿低代碼平臺項目

文章目錄

    • 1 分頁
      • 1.1 url與分頁參數
      • 1.2 分頁組件與url
      • 1.3 列表頁引用分頁組件
    • 2 加載更多
      • 2.1 狀態
      • 2.2 觸發時機
      • 2.3 加載數據
      • 2.4優化
    • 結語

1 分頁

1.1 url與分頁參數

查詢問卷列表接口,添加分頁參數:

  • page:當前頁碼(第幾頁)
  • pageSize:每頁多少條記錄

question.ts 查詢文件接口列表參數擴展,如下所示:

type SearchOption = {keyword: string;isStar: boolean;isDeleted: boolean;page: number;pageSize: number;
};

瀏覽器url獲取分頁參數,useLoadQuestionListData.ts代碼如下所示:

import { useSearchParams } from "react-router-dom";
import { useRequest } from "ahooks";
import { getQuestionListApi } from "@/api/question";import {LIST_SEARCH_PARAM_KEY,LIST_PAGE_PARAM_KEY,LIST_PAGE_SIZE_PARAM_KEY,LIST_PAGE_SIZE_DEFAULT,LIST_PAGE_DEFAULT,
} from "@/constant";type OptionType = {isStar: boolean;isDeleted: boolean;page: number;pageSize: number;
};/*** 獲取問卷列表* @returns 問卷列表*/
function useLoadQuestionListData(opt: Partial<OptionType>) {const { isStar, isDeleted } = opt;const [searchParams] = useSearchParams();const keyword = searchParams.get(LIST_SEARCH_PARAM_KEY) || "";const page =parseInt(searchParams.get(LIST_PAGE_PARAM_KEY) || "") || LIST_PAGE_DEFAULT ;const pageSize =parseInt(searchParams.get(LIST_PAGE_SIZE_PARAM_KEY) || "") ||LIST_PAGE_SIZE_DEFAULT;async function load() {const data = await getQuestionListApi({keyword,isStar,isDeleted,page,pageSize,});//...
}export default useLoadQuestionListData;

服務端解析分頁參數,question.js代碼如下:

const Mock = require('mockjs')const getQuestionList = require("./data/getQuestionList")const Random = Mock.Randommodule.exports = [// ...{// 獲取問卷列表url: '/api/question',method: 'get',response(ctx) {const { query = {} } = ctxconst isStar = query.isStar === 'true'const isDeleted = query.isDeleted === 'true'const page = parseInt(query.page) || 1const pageSize = parseInt(query.pageSize) || 10return {errno: 0,data: {list: getQuestionList({isStar, isDeleted, page, pageSize}),total: 100}}}},
]

1.2 分頁組件與url

antd分頁組件與url交互

由于多個列表頁面都需要分頁組件,這里我們以antd分頁組件為基礎,封裝自定義分頁組件,并且實現分頁參數與url參數交互,ListPage.tsx代碼如下所示:

import { FC, useEffect, useState } from "react";
import { useLocation, useNavigate, useSearchParams } from "react-router-dom";
import { Pagination } from "antd";import {LIST_PAGE_DEFAULT,LIST_PAGE_PARAM_KEY,LIST_PAGE_SIZE_DEFAULT,LIST_PAGE_SIZE_PARAM_KEY,
} from "@/constant";type PropsType = {total: number;
};const ListPage: FC<PropsType> = (props: PropsType) => {const [current, setCurrent] = useState(LIST_PAGE_DEFAULT);const [pageSize, setPageSize] = useState(LIST_PAGE_SIZE_DEFAULT);const [searchParams] = useSearchParams();useEffect(() => {const curPage =parseInt(searchParams.get(LIST_PAGE_PARAM_KEY) || "") ||LIST_PAGE_DEFAULT;const curPageSize =parseInt(searchParams.get(LIST_PAGE_SIZE_PARAM_KEY) || "") ||LIST_PAGE_SIZE_DEFAULT;setCurrent(curPage);setPageSize(curPageSize);}, [searchParams]);const { total } = props;// 當page pageSize改變時,跳轉頁面(改變url)const nav = useNavigate();const { pathname } = useLocation();function handlePageChange(page: number, pageSize: number) {searchParams.set(LIST_PAGE_PARAM_KEY, page.toString());searchParams.set(LIST_PAGE_SIZE_PARAM_KEY, pageSize.toString());nav({pathname,search: searchParams.toString(),});}return (<Paginationcurrent={current}pageSize={pageSize}total={total}onChange={handlePageChange}/>);
};export default ListPage;

1.3 列表頁引用分頁組件

“星標問卷”列表頁Star.tsx代碼如下:

// ...
import ListPage from "@/components/ListPage";const List: FC = () => {// ...//問卷列表數據const { data = {}, loading } = useLoadQuestionListData({ isStar: true });const { list = [], total = 0 } = data;
// ...<div className={styles.footer}><ListPage total={total} /></div></>);
};export default List;

“回收站”列表頁Trash.tsx代碼如下所示:

import { FC, useState } from "react";
import { useTitle } from "ahooks";
import ListPage from "../../components/ListPage";const List: FC = () => {useTitle("調查問卷-回收站");//問卷列表數據const { data = {}, loading } = useLoadQuestionListData({ isDeleted: true });const { list = [], total = 0 } = data;
// ...<div className={styles.footer}><ListPage total={total} /></div></>);
};export default List;

在這里插入圖片描述

2 加載更多

2.1 狀態

基礎

  • page:當前頁
  • list:全部數據列表,上劃累加
  • total:總條數

計算項

  • hasMoreData:是否有更多數據

2.2 觸發時機

  • 頁面加載觸發
  • 頁面滾動到加載更多數據時觸發
    • 監聽頁面滾動
    • 防抖處理
    • DOM計算頁面滾動刀”加載更多“

2.3 加載數據

  • useRequest請求接口
  • 接口返回數據,設置狀態

2.4優化

  • 加載更多,緩存處理
  • 刷新頁面優化暫無數據
  • 搜索重置狀態

完整”我的問卷“頁List.tsx代碼如下所示:

import { FC, useEffect, useMemo, useRef, useState } from "react";
import { useSearchParams } from "react-router-dom";
import { useDebounceFn, useRequest, useTitle } from "ahooks";
import { Typography, Spin, Empty } from "antd";import QuestionCard from "@/components/QuestionCard";
import ListSearch from "@/components/ListSearch";
import styles from "./common.module.scss";
import { getQuestionListApi } from "@/api/question";
import { LIST_PAGE_SIZE_DEFAULT, LIST_SEARCH_PARAM_KEY } from "@/constant";const { Title } = Typography;const List: FC = () => {useTitle("調查問卷-我的問卷");//問卷列表數據const [started, setStarted] = useState(false);const [page, setPage] = useState(1);const [list, setList] = useState([]); // 全部列表數據,上劃加載更多,累計const [total, setTotal] = useState(0);const hasMoreData = total > list.length;const [searchParams] = useSearchParams();const keyword = searchParams.get(LIST_SEARCH_PARAM_KEY) || "";// 搜索重置狀態useEffect(() => {setStarted(false);setPage(1);setList([]);setTotal(0);}, [keyword]);// 加載數據const { run: loadData, loading } = useRequest(async () => {const data = await getQuestionListApi({page,pageSize: LIST_PAGE_SIZE_DEFAULT,keyword,});return data;},{manual: true,onSuccess(res) {const { list: newList = [], total = 0 } = res;// 累計數據setList(list.concat(newList));setTotal(total);setPage(page + 1);},});// 嘗試觸發加載-防抖處理const containerRef = useRef<HTMLDivElement>(null);const { run: tryLoadMore } = useDebounceFn(() => {const elem = containerRef.current;if (elem == null) {return;}// 判斷如果div bottom 小于等于頁面的高度const domRect = elem.getBoundingClientRect();if (domRect == null) {return;}const { bottom } = domRect;if (bottom <= document.body.clientHeight) {// 加載數據loadData();setStarted(true);}},{ wait: 500 });// 觸發時機:頁面加載或者url參數(keyword)變化時useEffect(() => {// 第一次加載,初始化tryLoadMore();}, [searchParams]);// 監聽頁面滾動事件useEffect(() => {if (hasMoreData) {window.addEventListener("scroll", tryLoadMore);}return () => {// 解綁事件window.removeEventListener("scroll", tryLoadMore);};}, [searchParams, hasMoreData]);// 加載更多顯示優化const LoadMoreContentElem = useMemo(() => {if (!started || loading) {return <Spin />;}if (total === 0) {return <Empty description="暫無數據" />;}if (!hasMoreData) {return <span>沒有更多了……</span>;}return <span>開始加載下一頁</span>;}, [started, loading, hasMoreData]);return (<><div className={styles.header}><div className={styles.left}><Title level={3}>我的問卷</Title></div><div className={styles.right}><ListSearch /></div></div><div className={styles.content}>{list.length > 0 &&list.map((q: any) => {const { _id } = q;return <QuestionCard key={_id} {...q} />;})}</div><div className={styles.footer}><div ref={containerRef}>{LoadMoreContentElem}</div></div></>);
};export default List;

在這里插入圖片描述

結語

?QQ:806797785

??倉庫地址:https://gitee.com/gaogzhen

??倉庫地址:https://github.com/gaogzhen

[1]ahook官網[CP/OL].

[2]mock文檔[CP/OL].

[3]Ant Design官網[CP/OL].

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【技術追蹤】基于擴散模型的腦圖像反事實生成與異常檢測(TMI-2024)

一種新穎的擴散模型雙重采樣策略&#xff0c;DDPM DDIM ~ 論文&#xff1a;Diffusion Models for Counterfactual Generation and Anomaly Detection in Brain Images 0、摘要 病理區域的分割掩模在許多醫學應用中很有用&#xff0c;例如腦腫瘤和中風管理。此外&#xff0c;疾…

第十六屆藍橋杯大賽軟件賽省賽第二場 C/C++ 大學 A 組

比賽還沒有開始&#xff0c;竟然忘記寫using namespace std; //debug半天沒看明白 (平時cv多了 然后就是忘記那個編譯參數&#xff0c;&#xff08;好慘的開局 編譯參數-stdc11 以下都是賽時所寫代碼&#xff0c;賽時無聊時把思路都打上去了&#xff08;除了倒數第二題&#…

CentOS 7上Memcached的安裝、配置及高可用架構搭建

Memcached是一款高性能的分布式內存緩存系統&#xff0c;常用于加速動態Web應用的響應。本文將在CentOS 7上詳細介紹Memcached的安裝、配置&#xff0c;以及如何實現Memcached的高可用架構。 &#xff08;1&#xff09;、搭建memcached 主主復制架構 Memcached 的復制功能支持…

告別進度失控:用燃盡圖補上甘特圖的監控盲區

在職場中&#xff0c;項目經理最頭疼的莫過于“計劃趕不上變化”。明明用甘特圖排好了時間表&#xff0c;任務卻總像脫韁野馬——要么進度滯后&#xff0c;要么資源分配失衡。甘特圖雖能直觀展示任務時間軸&#xff0c;但面對突發風險或團隊效率波動時&#xff0c;它更像一張“…

爬蟲-oiwiki

我們將BASE_URL 設置為 "https://oi-wiki.org/" 后腳本就會自動開始抓取該url及其子頁面的所有內容&#xff0c;并將統一子頁面的放在一個文件夾中 import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import os import pd…

業務中臺與數據中臺:企業數字化轉型的核心引擎

前言&#xff1a;在當今數字化浪潮下&#xff0c;企業為了提升運營效率、加速創新步伐并更好地適應市場變化&#xff0c;業務中臺與數據中臺應運而生&#xff0c;成為企業架構中的關鍵組成部分。本文將深入探討業務中臺和數據中臺的簡介、發展史、技術流環節以及在實際生產中的…

django admin 去掉新增 刪除

在Django Admin中&#xff0c;你可以通過自定義Admin類來自定義哪些按鈕顯示&#xff0c;哪些不顯示。如果你想隱藏“新增”和“刪除”按鈕&#xff0c;可以通過重寫change_list_template或使用ModelAdmin的has_add_permission和has_delete_permission屬性來實現。 方法1&…

基于云原生架構的后端微服務治理實戰指南

一、引言&#xff1a;為什么在云原生時代更需要微服務治理&#xff1f; 在單體應用時代&#xff0c;開發和部署雖然簡單&#xff0c;但隨著系統規模的擴大&#xff0c;單體架構的維護成本急劇上升&#xff0c;部署頻率受限&#xff0c;模塊之間相互影響&#xff0c;最終導致系…

MIT6.S081 - Lab10 mmap(文件內存映射)

本篇是 MIT6.S081 2020 操作系統課程 Lab10 的實驗筆記&#xff0c;目標只有一個&#xff1a;實現文件映射到內存的功能&#xff0c;也就是 mmap。 作為一名 Android 開發者&#xff0c;我可太熟悉 mmap 這個詞兒了。Android 的 跨進程通信 Binder 驅動、圖形內存分配和管理、…

基于BenchmarkSQL的OceanBase數據庫tpcc性能測試

基于BenchmarkSQL的OceanBase數據庫tpcc性能測試 安裝BenchmarkSQL及其依賴安裝軟件依賴編譯BenchmarkSQLBenchmarkSQL props文件配置數據庫和測試表配置BenchmarkSQL壓測裝載測試數據TPC-C壓測(固定事務數量)TPC-C壓測(固定時長)生成測試報告重復測試流程梳理安裝Benchmar…

WinForm真入門(17)——NumericUpDown控件詳解

一、基本概念? NumericUpDown 是 Windows 窗體中用于數值輸入的控件&#xff0c;由文本框和上下調節按鈕組成。用戶可通過以下方式調整數值&#xff1a; 點擊調節按鈕增減數值鍵盤直接輸入使用方向鍵調整 適用于需要限制數值范圍或精確控制的場景&#xff08;如年齡、參數配…

汽車自動駕駛介紹

0 Preface/Foreword 1 介紹 1.1 FSD FSD: Full Self-Driving&#xff0c;完全自動駕駛 &#xff08;Tesla&#xff09; 1.2 自動駕駛級別 L0 - L2&#xff1a;輔助駕駛L3&#xff1a;有條件自動駕駛L4/5 &#xff1a;高度/完全自動駕駛

AiCube 試用 - ADC 水位監測系統

AiCube 試用 - ADC 水位監測系統 水位檢測在水資源管理、城市防洪、農業灌溉、家用電器和工業生產等多領域發揮積極建設作用。利用水位傳感器&#xff0c;可以實現水資源的智能管理&#xff0c;提高生產效率。 本文介紹了擎天柱開發板利用 AiCube 工具快速創建 I/O 電壓讀取&…

秒殺壓測計劃 + Kafka 分區設計參考

文章目錄 前言&#x1f680; 秒殺壓測計劃&#xff08;TPS預估 測試流程&#xff09;1. 目標設定2. 壓測工具推薦3. 壓測命令示例&#xff08;ab版&#xff09;4. 測試關注指標 &#x1f4e6; Kafka Topic 分區設計參考表1. 單 Topic 設計2. 分區路由規則設計&#xff08;Part…

memcpy 使用指南 (C語言)

memcpy 是 C 語言標準庫中的一個重要函數&#xff0c;用于在內存區域之間復制數據。它是 <string.h> 頭文件中定義的高效內存操作函數之一。 函數原型 void *memcpy(void *dest, const void *src, size_t n); 參數說明 dest: 目標內存地址&#xff0c;數據將被復制到這…

跨境電商貨物體積與泡重計算器:高效便捷的物流計算工具

跨境電商貨物體積與泡重計算器&#xff1a;高效便捷的物流計算工具 工具簡介 貨物體積與泡重計算器是一款免費的在線工具&#xff0c;專門為物流從業者、跨境電商賣家和需要計算貨物運輸體積重量的用戶設計。這款工具可以幫助您快速計算貨物的體積和對應的空運、快遞泡重&…

如何避免爬蟲因Cookie過期導致登錄失效

1. Cookie的作用及其過期機制 1.1 什么是Cookie&#xff1f; Cookie是服務器發送到用戶瀏覽器并保存在本地的一小段數據&#xff0c;用于維持用戶會話狀態。爬蟲在模擬登錄后&#xff0c;通常需要攜帶Cookie訪問后續頁面。 1.2 Cookie為什么會過期&#xff1f; 會話Cookie&…

matlab simulink中理想變壓激磁電流容易有直流偏置的原因分析。

simulink把線性變壓器模塊拉出來&#xff0c;設置沒有繞線電阻的變壓器&#xff0c;激磁電感和Rm都有&#xff0c;然后給一個50%占空比的方波&#xff0c;幅值正負10V&#xff0c;線路中設置一個電阻&#xff0c;模擬導線阻抗。通過示波器觀察激磁電流&#xff0c;發現電阻越小…

電力系統失步解列與振蕩解析

一、基本概念解析 1. 失步&#xff08;Out-of-Step&#xff09; 在電力系統中&#xff0c;失步是指并列運行的同步發電機因功率失衡導致轉子間相對角度超過穩定極限&#xff0c;無法維持同步運行的狀態。具體表現為&#xff1a; 當系統發生短路、負荷突變或故障切除等擾動時&…

ctfhub-RCE

關于管道操作符 windows&#xff1a; 1. “|”&#xff1a;直接執行后面的語句。 2. “||”&#xff1a;如果前面的語句執行失敗&#xff0c;則執行后面的語句&#xff0c;前面的語句只能為假才行。 3. “&”&#xff1a;兩條命令都執行&#xff0c;如果前面的語句為假則直…