组件卸载时远程用户未清除导致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,提问作者Анна Гарькуша
相关产品推荐
相关产品推荐

