问题
react hooks使用useEffect监听pagination快速点击分页一直请求记录
描述
使用react hooks做一个分页加载数据,使用useState,useEffect API,实现思路当分页变化 时触发onchange事件,在onchange事件中更新pagination的currentPage当前页,使用useEffetc监听pagination.currentPage,变化时调请求获取表格数据列表this.getTableData。
出现问题
在正常点击中,上述实现方法没有任何问题;但是,在快速切换分页时会出现大量请求接口,如快速来回切换 5,6,8。请求接口中会大量重复请求5,6,7页数据,极为诡异
解决
大致问题排查如下,经测试,使用react hooks在render中会实时响应当前值 的修改,但是在异常操作中如setTimout,axios请求中当我们更新状态的时候,React 会重新渲染组件, 每一次渲染都会拿到独立的 count 状态, 并重新渲染一个 handleAlertClick 函数. 每一个 handleAlertClick 里面都有它自己的 count .

最终结果是 在count为6的时候, 点击 show alert , 再继续增加 count , 弹出的值为 6, 而非 10.
如何让点击时候弹出实时的 count ?
使用useRef记录实时的一个值,并使用useEffect监听更新ref.current的值

使用antd加载分页数据 的场景
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| const [searchData, setSearchData] = useState(Object.assign({}, defaultFilter)); const [paginationData, setPaginationData] = useState({ total: 1000, currentPage: 1, pageSize: 10 }); const [tableData, setTableData] = useState([]); const lastPage = useRef(paginationData.currentPage);
const pageChange = page => { let pagination = Object.assign({}, paginationData); pagination.currentPage = page; setPaginationData(pagination); }
const getTableData = async () => { let { currentPage, pageSize } = paginationData; let { name, type, time } = searchData; let obj = { }; if (name) { obj["username"] = name; } if (type) { obj["titleType"] = [type] } if (time) { obj["startTime"] = time[0]; obj["endTime"] = time[1]; } const result = await post(`${getLogsList}?pageIndex=${currentPage}&pageSize=${pageSize}`, obj); let { ret, data = [], count } = result.data; if (ret === success) { setTableData(data); setPaginationData({...paginationData,total:count,currentPage: lastPage.current}); } } useEffect(()=>{ lastPage.current = paginationData.currentPage; },[paginationData.currentPage]);
useEffect(() => { getTableData(); }, [searchData, paginationData.currentPage])
|
参考链接: https://zhuanlan.zhihu.com/p/105276393