You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

组件卸载时远程用户未清除导致Twilio视频重复问题求助

解决Twilio类组件卸载后远程用户重复显示的问题

直接清空参与者数组没用,核心原因是Twilio的房间事件监听器还绑定在组件上,组件卸载后仍会触发参与者更新回调,同时房间连接没断开也会导致Twilio侧的参与者状态没清理。按以下步骤修复:

  • 挂载组件时,把Twilio房间的事件回调存为组件实例属性,方便后续移除监听:

    componentDidMount() {
      this.initTwilioRoom();
    }
    
    async initTwilioRoom() {
      this.room = await Twilio.Video.connect(this.props.token, {
        // 你的房间配置
      });
    
      // 保存回调到实例,用于卸载时移除监听
      this.handleParticipantConnected = (participant) => {
        this.setState(prev => ({
          participants: [...prev.participants, participant]
        }));
      };
      this.room.on('participantConnected', this.handleParticipantConnected);
    
      this.handleParticipantDisconnected = (participant) => {
        this.setState(prev => ({
          participants: prev.participants.filter(p => p.sid !== participant.sid)
        }));
      };
      this.room.on('participantDisconnected', this.handleParticipantDisconnected);
    }
    
  • 在componentWillUnmount中先清理Twilio的事件监听,断开房间连接,最后清空本地状态:

    componentWillUnmount() {
      if (!this.room) return;
    
      // 移除所有绑定的事件监听,防止卸载后回调触发状态更新
      this.room.off('participantConnected', this.handleParticipantConnected);
      this.room.off('participantDisconnected', this.handleParticipantDisconnected);
      
      // 断开Twilio房间连接,彻底终止会话关联
      this.room.disconnect();
    
      // 清空本地参与者数组并释放房间实例
      this.setState({ participants: [] }, () => {
        this.room = null;
      });
    }
    
  • 额外检查:如果问题仍存在,确认是否父组件或全局状态中也保存了参与者数据,需要在当前组件卸载时同步通知上层清理对应数据,避免跨组件的状态残留。

内容的提问来源于stack exchange,提问作者Анна Гарькуша

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:02:07