node.js - React 组件未在 socket.io 事件上更新
问题描述
我无法弄清楚为什么我的 React 组件在查看者数量发生变化后没有更新。当页面首次呈现时,金额会正确显示。套接字事件也可以记录到我的终端。
可能有一个简单的解决方法。我究竟做错了什么?
服务器
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const port = process.env.PORT || 4001;
const index = require('./index');
const app = express();
app.use(index);
const server = http.createServer(app);
const io = socketIo(server);
io.on('connection', (socket) => {
console.log('+ client connected');
getApiAndEmit(socket);
socket.on('disconnect', () => {
console.log('- Client disconnected');
getApiAndEmit(socket);
});
});
const getApiAndEmit = (socket) => {
socket.emit('event', io.engine.clientsCount);
};
server.listen(port, () => console.log(`Listening on port ${port}`));
反应
import React from 'react';
import socketIOClient from 'socket.io-client';
class App extends React.Component {
constructor() {
super();
this.state = {
response: false,
endpoint: 'http://localhost:4001',
};
}
componentDidMount() {
const { endpoint } = this.state;
const socket = socketIOClient(endpoint);
socket.on('event', (data) => this.setState({ response: data }));
}
render() {
const { response } = this.state;
return (
<p>{response ? <p>Active Users {response}</p> : <p>Loading...</p>}</p>
);
}
}
export default App;
解决方案
我认为问题在于您使用了错误的发射类型。看看这个备忘单:https ://socket.io/docs/emit-cheatsheet/
如果使用socket.emit()
,socketio 仅将事件发送到单个连接的客户端,如果使用socket.broadcast.emit()
,它将向除发送者之外的每个客户端发出事件,如果使用io.emit()
,它将向每个客户端发出事件。
所以我认为你的代码应该是这样的:
io.on('connection', (socket) => {
io.emit('event', io.engine.clientsCount);
socket.on('disconnect', () => {
socket.broadcast.emit('event', io.engine.clientsCount);
});
});
推荐阅读
- python - 'pyuic5' 不是内部或外部命令、可运行程序或批处理文件
- python - 如何使用其他数据框列将多列添加到 python 数据框
- java - 通过 maven 命令使用 beanshell 运行 testng gropus 时出错
- apache-spark - 无法启动 spark-shell 未能提交 spark-submit
- django - 如何根据应用于字段的函数从模型中获取列表而不更改表中的值
- java - Android FCM 在应用程序被杀死时部分工作
- function - 如何在变量模板中正确使用 Azure DevOps 函数?
- flutter - Flutter 中的自定义 BottomNavigationBar
- java - Checkstyle ConstantName 规则适用于并非真正恒定的事物
- scheme - Scheme语言中是否有正常的“设置”功能(不是特殊形式)?