Naive UI分页跳转后数据没变怎么处理?
用Naive UI的Pagination做分页时,切换页码后数据没变卡了好久了。我按文档写了onChange事件,也传了当前页码参数,但每次请求接口返回的数据还是第一页的内容。
代码大概是这样写的:<n-pagination v-model:page="currentPage" :page-count="totalPages" @update:page="handlePageChange" />
在handlePageChange里写了async function handlePageChange() { await fetchData(currentPage) },但控制台显示每次请求的页码参数都是1,和组件显示的当前页数不一致。试过手动设置v-model:page还是没解决,是不是哪里绑定错了?
currentPage和handlePageChange的逻辑没对上。Naive UI 的update:page事件触发时,它并不会自动更新v-model:page的值,需要手动处理。具体来说,你在
handlePageChange方法里用的currentPage并不是最新的页码,而是之前的值。解决方法很简单,在handlePageChange方法里直接用传入的参数,而不是依赖currentPage。代码可以改成这样:另外确保你的
fetchData方法里是用传入的page参数去请求接口,而不是用组件外部的currentPage。还有一点要注意,
v-model:page是双向绑定的,如果你在父组件里手动改了currentPage的值,记得保证这个值和分页组件的状态一致。比如可以在fetchData成功后再同步一下:最后检查一下你的接口是不是有问题,有些后端接口可能默认不接受页码参数或者有默认值,导致一直返回第一页的数据。这种情况可以抓一下网络请求看看实际发出去的参数对不对。
总之就是三个点:一是用
handlePageChange的参数;二是保持currentPage同步;三是确认接口行为。按这个思路调一下就没问题了。currentPage的更新时机上。你现在是把currentPage传给fetchData,但 Vue 的v-model更新是异步的,handlePageChange触发时currentPage还没变过来,所以每次传的其实是旧值,也就是第一页。正确的做法是在
@update:page回调里直接用新页码参数发起请求,而不是读取currentPage。改一下你的代码:然后去掉你在
fetchData里依赖的currentPage,直接用传进来的page参数去拼接口。这样不管数据响应多慢,页码都是对的。前端这块经常有人被这种响应式数据更新的异步性坑到,尤其是 Naive UI 这种组件内部做了防抖或者延迟更新的。记住一个原则:event 回调里的参数是最新的,data 里的值可能是滞后的。