react由于state内容更新延迟导致http请求重复发送问题

业务场景:滑动鼠标滚轮动态加载数据
每次滚动鼠标滚轮,发送请求后台返回分页数据,分页中使用的page和size保存在state中, 由于state中的数据更新延迟,如果滚动鼠标滚轮过快,就会发送page和size相同的http请求,导致加载重复数据。
解决方法一:每次发送请求时,page不修改,只修改size大小,然后把新返回的数据覆盖原有数据,即使多次发送重复请求在页面也不会显示出重复数据的问题
伪代码如下:

import React, { Component } from 'react'

export default class page extends Component {

    state = {
        page:1,
        //控制每页返回的条数
        size:10,
        data:{},
        //标志是否已返回全部数据
        isAll:false,
    }

    onWheel = ()=>{
        if(this.state.isAll)
        {
            return 
        }
        let requestData={"page":1,"size":this.state.size}
        this.http(requestData)
        
    }

    http = (data) =>{
        //发送http请求
        post(data).then(
            request =>{
                //如果返回10条数据,则this.state.size+10
                let newsize = this.state.size+10
                this.setstate({
                    size:newsize,
                    data:request.data
                }) 
                //如果返回的数据小于10条,则修改this.state.isAll=true
                this.setstate({
                    isAll:true,
                    data:request.data
                }) 
            }
        )
    }
 

    render() {
        return (
            <div>
                {
                    this.state.data
                }
            </div>
        )
    }
    }

解决方案二:
额外定义一个g_Page变量和state中的page进行比较,如果page小于state.page则发送请求,每次发送请求后将g_Page重置为state.page;如果不小于则不发送请求,新数据追加到老数据后面,这样可以防止发送重复请求到服务器,减轻服务器压力
伪代码如下

import React, { Component } from 'react'

const g_page = 1
export default class page extends Component {

    state = {
        page:1,
        size:10,
        data:{},
        //用来标志是否已请求到所有数据
        isAll:false
    }

    onWheel = ()=>{
        if(this.state.isAll)
        {
            return 
        }
        if(g_page<this.state.page)
        {
            let requestData={"page":1,"size":this.state.size}
            this.http(requestData)
            g_page=this.state.page
        }
       

        
    }

    http = (data) =>{
        //发送http请求
        post(data).then(
            request =>{
                //如果返回10条数据,则page+1
                let page = this.state.page
                this.setstate({
                    page:page+1,
                    data:this.state.data+request.data
                })
                //如果返回的数据小于10条,则修改state.isAll=true  
                this.setstate({
                    isAll:true,
                    data:this.state.data+request.data
                })
            }
        )
    }
 

    render() {
        return (
            <div>
                {
                    this.state.data
                }
            </div>
        )
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值