需求 函数组件实现一个下拉上拉的列表,列表支持分页。最开始我们使用setstate的方式去报错当前页数。这样做的问题,就是有一个异步的延迟。上代码
const [pageNo, setpageNo] = useState(1)
const onPullUpRefresh = () => {
console.log("上拉加载内容")
console.log("上一次的pageNo", pageNo)
setpageNo(pageNo + 1)
console.log("增加后的pageNo", pageNo)
console.log("上拉页数+1", pageNo)
//网络请求获取数据
setList()
}
// 获取列表数据
const setList = () => {
// // 判断是考试还是课程
if (current === 0) {
console.log('刷新考试内容')
const params = {
pageNo: pageNo,
pageSize: 10,
examStatus: flag,
}
console.log('获取数据入参是什么-------', params)
getPersonExamList(params).then(res => {
if (res.code === '0') {
if (pageNo == 1) {
console.log('上拉记载结果为----', res.data.list)
setExamList(res.data.list)
setCourseList([])
} else {
console.log('上拉记载结果为----', res.data.list)
examList.push(...res.data.list)
console.log('new listdata 合并后的------', examList)
setExamList(JSON.parse(JSON.stringify(examList)))
}
}
})
}
这样可以实现功能,但是结果就是上拉一次还是刷新第一页内容。拉两次才更能拉到第二页的数据。就是setstate有一个延迟。第一次上拉的时候。pageNo异步处理 还没更新到2,所以总是差一页。第一次上拉不会加载出第二页的内容。有图片可以看出还是10条数据。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0DNy4UejRlWshnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1QTO2ADNzkDM4EDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
解决方案:
1.useRef 通常大家都是用这个来进行绑定dom操作。但是忽略的这个是可以当做存储容器来用的 也就是引用一个PageNo 然后通过useRef进行同步操作
const [pageNo, setpageNo] = useState(1)
const numRef = useRef(pageNo);
const onPullUpRefresh = () => {
console.log("上拉加载内容")
console.log("上一次的pageNo", numRef.current)
numRef.current = numRef.current + 1
console.log("增加后的pageNo", numRef.current)
//网络请求获取数据
setList()
}
// 获取列表数据
const setList = () => {
// // 判断是考试还是课程
if (current === 0) {
console.log('刷新考试内容')
const params = {
pageNo: numRef.current,
pageSize: 10,
examStatus: flag,
}
console.log('获取数据入参是什么-------', params)
getPersonExamList(params).then(res => {
if (res.code === '0') {
if (numRef.current == 1) {
console.log('上拉记载结果为----', res.data.list)
setExamList(res.data.list)
setCourseList([])
} else {
console.log('上拉记载结果为----', res.data.list)
examList.push(...res.data.list)
console.log('new listdata 合并后的------', examList)
setExamList(JSON.parse(JSON.stringify(examList)))
}
console.log('接口中pageNO的值是什么', numRef.current)
}
})
}
这样就可以正常实现上拉逻辑~
解决方案2
定义一个全局变量 通过全局变量来控制页码
//同步处理pageNO
var pageNo = 1
function Training() {
函数组件---------
}
其他逻辑同上面。但是一定要注意定义pageNo的代码要写在函数组件外面。这样才能实现每次上拉刷新进行累加。否则每次上拉都是从1加到2 因为每次函数重新调用 pageNo都会被重置为1