next.js管道函数getServerSideProps配合antd完成分页

在页面请求的时候我们都知道先去的时候就会先执行管道函数,来请求数据,当然它是由页面跳转才会执行的,也就是你访问某个路由的时候执行。那么这个时候就会渠道问题,开始的时候自己也是比较愚笨没有仔细看官方文档,想着在页面中用onChangeaxios直接搭配使用请求数据,但是也是不知道为什么在server层就是接收不到传来的参数,也是奇怪。自己的server使用的是egg.js利用this.ctx来获取,也是详细查看了相关的api,但是获取不到,求告知。
后面就去研究next.js的官网,其中就是这样一段话
在这里插入图片描述
但是你会发现,其实并不会刷新页面,这也是因为next.js的特性
搭配onChange来执行请求,

const onChange = (e) => {
   
   
    setPage(e);
    router
### 使用 IntersectionObserver 实现 Antd Table 的懒加载或虚拟分页 Intersection Observer 是一种高效的 API,用于监听目标元素何时进入视口范围。通过结合 Ant Design 的 `Table` 组件,可以实现类似于分页的效果,但实际上并不需要手动翻页,而是当用户滚动到表格底部时自动加载更多数据。 以下是具体实现方法: #### 1. 创建一个可观察的目标元素 为了触发懒加载行为,在表格的最后一行创建一个占位符 DOM 元素作为观察对象。这个元素将在每次新数据追加完成后重新定位到最后。 ```jsx const observerTarget = () => ( <tr> <td colSpan={columns.length}> <div ref={setObserverRef} style={{ height: '1px' }} /> </td> </tr> ); ``` 此处的 `ref={setObserverRef}` 将绑定至实际的 DOM 节点以便后续由 IntersectionObserver 进行监控[^5]。 #### 2. 初始化 IntersectionObserver 并定义回调函数 设置 IntersectionObserver 来检测该占位符是否进入了可视区域。一旦它被看到,则调用服务端接口获取额外的数据并更新状态。 ```javascript useEffect(() => { const options = { root: null, rootMargin: '0px', threshold: 1.0 // 当完全可见时触发 }; const callback = (entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting && !isLoadingMore) { setIsLoadingMore(true); // 防止重复请求 fetchNextPage().then(() => setIsLoadingMore(false)); } }); }; const observerInstance = new IntersectionObserver(callback, options); if (observerRef.current) { observerInstance.observe(observerRef.current); } return () => observerInstance.disconnect(); }, [isLoadingMore]); ``` 这里需要注意的是要防止多次连续触发展开逻辑,因此引入了一个布尔变量 `isLoadingMore` 控制并发问题[^6]。 #### 3. 更新表单数据源 每当接收到新的响应结果之后都需要将其附加到现有的记录集合后面形成完整的展示列表。 ```javascript async function fetchNextPage() { try { const response = await fetchData(currentPageIndex * pageSize, pageSize); setCurrentPageIndex(prevIndex => prevIndex + 1); setDataSource(prevData => [...prevData, ...response.data]); } catch (error) { console.error('Failed to load more data:', error); } } ``` 此部分假设存在某种形式的服务端支持允许基于偏移量查询指定数量的结果集[^7]。 #### 完整示例代码片段 下面给出了一段综合以上各要点的实际应用例子供参考学习之用: ```tsx import React, { useState, useEffect, useRef } from 'react'; import { Table } from 'antd'; const LazyLoadTable = ({ columns }) => { const [dataSource, setDataSource] = useState([]); const [currentPageIndex, setCurrentPageIndex] = useState(0); const [pageSize, setPageSize] = useState(20); const [isLoadingMore, setIsLoadingMore] = useState(false); const observerRef = useRef(null); useEffect(() => { const options = { root: null, rootMargin: '0px', threshold: 1.0 }; const callback = (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting && !isLoadingMore) { setIsLoadingMore(true); fetchNextPage() .catch(err => console.log(`Error fetching next page`, err)) .finally(() => setIsLoadingMore(false)); } }); }; const observerInstance = new IntersectionObserver(callback, options); if (observerRef.current) { observerInstance.observe(observerRef.current); } return () => observerInstance.disconnect(); }, [isLoadingMore]); async function fetchNextPage() { const newData = await mockApiCall(currentPageIndex * pageSize, pageSize); setCurrentPageIndex(prevIndex => prevIndex + 1); setDataSource(prevData => [...prevData, ...newData]); } const setObserverRef = el => { if (el) { observerRef.current = el; } }; return ( <> <Table dataSource={dataSource} columns={columns} pagination={false} scroll={{ y: 400 }} > <tbody> {/* 动态生成的内容 */} {Array.isArray(dataSource) && dataSource.map(row => ( <tr key={row.key}> {columns.map(col => ( <td>{col.render?.(row[col.dataIndex]) || row[col.dataIndex]}</td> ))} </tr> ))} {/* 加载指示器 */} {isLoadingMore && ( <tr> <td colSpan={columns.length}>正在加载...</td> </tr> )} {/* 可见性探测器 */} {!isLoadingMore && ( <tr> <td colSpan={columns.length}> <div ref={setObserverRef} style={{ height: '1px' }}></div> </td> </tr> )} </tbody> </Table> </> ); }; export default LazyLoadTable; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值