IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> react由于state内容更新延迟导致http请求重复发送问题 -> 正文阅读

[网络协议]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>
        )
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 20:46:44  更:2021-09-12 20:47:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/27 1:43:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码