天天看点

react 函数组件useState异步变同步

需求 函数组件实现一个下拉上拉的列表,列表支持分页。最开始我们使用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条数据。

react 函数组件useState异步变同步

 解决方案:

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