gpt4 book ai didi

javascript - 子组件从父组件中删除socket.io的事件监听器

转载 作者:行者123 更新时间:2023-12-03 00:47:20 26 4
gpt4 key购买 nike

我有一个 React 应用程序,并且正在将 socket.io 集成到 React 应用程序中。一些需要实时更改的页面,我使用套接字连接到一个房间,并在更改后向该房间发送消息。

我有一个子父结构,其中父级正在加入一个房间,而子级正在加入一个单独的房间。一切都很完美。当用户断开连接并再次连接时,我在 componentDidMount 上有一个事件,当用户重新连接到互联网时,该事件将自动加入房间。在 componentWillUnmount 上,我删除了该事件监听器。但是发生的情况是,当子组件卸载并重新连接互联网时,应自动加入父组件房间的父事件不会被调用。似乎子 componentWillUnmount 也删除了父组件的事件监听器。请让我知道如何修复它以及我做错了什么。

socket.js

import openSocket from 'socket.io-client';

let socket = '';
if(typeof window !== "undefined") {

let connectionUri = "http://"+window.location.hostname+":9001"


socket = openSocket(connectionUri;

socket.on('messages', function(data) {
alert(data);
});
}

export default socket;

我在每个 react 组件中使用上述文件来执行有关套接字的功能。

parent.js

import React, {Component} from 'react'
import Child1 from '../Child1/Index'
import Child2 from '../Child2/Index'
import socket from '../../../sockets'


export default class Parent extends Component {

componentDidMount() {
socket.emit('joinRoom', 'Parent')
socket.on('changeStatus', (data) => {
.....
})
socket.on('connect', () => {
socket.emit('joinRoom', 'Parent')
})
}

componentWillUnmount() {
socket.emit('leaveRoom', 'Parent')
socket.off('changeStatus')
socket.off('connect')
}

render() {

switch(this.props.pageValue) {
case "Child1":
return <Child1 .... />
case "Child2":
return <Child2 .... />
default:
return null
}
}

}

child.js

import React, {Component} from 'react'
import socket from '../../../sockets'


export default class Parent extends Component {

componentDidMount() {
socket.emit('joinRoom', 'Child')
socket.on('changeStatus', (data) => {
.....
})
socket.on('connect', () => {
socket.emit('joinRoom', 'Child')
})
}

componentWillUnmount() {
socket.emit('leaveRoom', 'Child')
socket.off('changeStatus')
socket.off('connect')
}

render() {
......
}

}

服务器.js

client.on('joinRoom', function(room) {
console.log('Connected to Room:', room);
client.join(room);
});

client.on('leaveRoom', function(room) {
console.log('Leaving Room:', room);
client.leave(room);
});

因此,当 socket.off('connect') 调用 Child1/Child2 时。看来父 connect 事件监听器也被删除了。

如果大家有任何疑问,请告诉我。抱歉英语不好

最佳答案

仅使用事件名称调用 socket.off 会导致取消订阅该事件的所有回调。您需要指定取消订阅哪个回调,以便其他回调可以保留。

componentDidMount() {
socket.emit('joinRoom', 'Child')
socket.on('changeStatus', this.onChangeStatus);
socket.on('connect', this.onConnect);
}

onChangeStatus(data) {
...
}

onConnect() {
socket.emit('joinRoom', 'Child')
}

componentWillUnmount() {
socket.emit('leaveRoom', 'Child')
socket.off('changeStatus', this.onChangeStatus);
socket.off('connect', this.onConnect);

// instead of:
// socket.off('changeStatus')
// socket.off('connect')
}

关于javascript - 子组件从父组件中删除socket.io的事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com