码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • websocket导致的setState不更新页面(useState)


    问题:
    直播页面,使用websocket来接收服务端传过来的数据,然后根据该数据,调用useState的第二个参数,
    来更新state。
    正常的时候是可以的。state被更新,页面被刷新。
    但是,当我们去另外一个页面,然后再返回该页面。页面不会动态刷新了。
    原因:
    问题的原因为,页面去另一个页面的时候,页面并没有彻底关闭websocket连接。再下一次返回该页面的时候,进行判断,导致没有重新初始化实例。

    const A = () => {
      if(websocket.clientConn) {
      		return;
      }
      const wsConn = `${LIVE_BROADCAST_WS_URL}?username=${encodeURI(name)}&role=presenter&group=${experimentRoomId}`;
      websocket.initConnection(wsConn, async(res:any) => {
        switch (res.id) {
          case "get_all_viewers":
            B(res);
            break;
        }
      }
    }
    
    const B = (res:any)=> {
        let viewerList: Viewer[] = [];
      
        setViewers([...viewers, ...viewerList]);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    解决办法:
    退出页面的时候,关闭websocket连接。

    useEffect(() => {
        kmsGlobal?.dispose();
    
        return () => {
          destroy();
          // 关闭websocket连接
          websocket.destroyResources()
        };
      }, []);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,destroyResources方法为:

    destroyResources: () => {
        // 关闭并销毁连接
        if (ws.clientConn) {
          ws.clientConn.close();
          // 赋值为空,否则即使close也有值
          ws.clientConn = undefined;
        }
        // 销毁心跳定时器
        if (ws.pongInterval) {
          clearInterval(ws.pongInterval);
        }
        // 销毁重连定时器
        if (ws.reconnectTimeout) {
          clearTimeout(ws.reconnectTimeout);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    C++位图—布隆过滤器
    【云原生之kubernetes】在kubernetes集群下的映射外部服务—Eendpoint
    线性表之顺序表
    电脑怎么安装xp系统原版镜像
    Redis缓存的一些概念性问题
    基于Java+SpringBoot+Vue前后端分离周边游平台设计和实现
    Java接入sqlserver的一些坑点记录
    js第六章
    一名资深架构师规划Java程序员五年职业生涯指南
    【最全】PS各个版本下载安装及小试牛刀教程(PhotoShop CS3 ~~ PhotoShop 2022)
  • 原文地址:https://blog.csdn.net/qq_38499019/article/details/126486987
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号