У меня есть такой компонент, как этот ниже. Я включил socket.io и создал его вне ВНЕШНИХ методов класса и lifecylce (я пытался создать экземпляр socket.io в конструкторе, и казалось, что он повторно подключается каждый раз, когда компонент монтируется, поэтому я переместил его наружу).
КАК ЭТО РАБОТАЕТ:
Когда кнопка нажимается, она вызывает метод onButtonPress, который отправляет на сервер express. js и избыточное хранилище, как показано в коде, и ответ другому клиенту. Получается в конструкторе с помощью socket.on (), как показано ниже:
Примечание: я использую избыточность в своем приложении с создателями действий, и я искал другие ответы, и ни один из них не отвечает на мой случай.
window.navigator.userAgent = 'react-native';
import io from 'socket.io-client/dist/socket.io';
this.socket = io('http://10.0.2.2:5000, {jsonp: false});
class Products extends Component {
constructor(props){
super(props)
socket.on('socSell',(data)=>{
console.log('The stuff I wanna do after receiving a responce')
}
}
onButtonPress(data){
this.socket.emit('socSell',data) //call to socket io express server
this.props.sell(data) //call to redux store(to action creators)
}
render(){
return(
<Button title='GO' onPress={()=>onButtonPress('mydata')}></Button>
)
}
}
Мой сервер Node / Express выглядит следующим образом, и обратите внимание, что я использую socket.broadcast.emit, который отправляет всем клиентам, кроме отправителя.
io.on('connection', (socket)=> {
socket.on('socSell',(data) => {
socket.broadcast.emit('socSell',data)
})
socket.on('disconnect', ()=>{
console.log('disconnected')
}
}
ПРОБЛЕМА: В моем приложении реакции, если я запускаю приложение в первый раз, оно работает нормально. Но если я скрою приложение (сделаю его неактивным за пределами экрана) и снова активирую его (компонент ie монтируется во второй раз), компонент socket.on () в конструкторе вызывается два раза. Если я прячу / сплю приложение вне экрана и снова активирую его, socket.on () в конструкторе вызывается три раза ... и так далее для 4-го, 5-го и т. Д. c.
Я хочу, чтобы часть socket.on () в ответе в конструкторе вызывалась один раз при нажатии кнопки всегда.
Что я делаю неправильно в приведенном выше коде и как я должен заставить его работать как предполагается?