javascript - 从 useEffect 连接 socket.io
问题描述
我想连接我的socket
连接useEffect
componentDidMount
const Chat = () => {
const [user, setUser] = useState('');
const [messages, setMessages] = useState([]);
const [input, setInput] = useState('');
const [isConnected, setIsConnected] = useState(false);
const socketRef = useRef(
io('http://localhost:3002', {
query: { token }
})
);
useEffect(() => {
socketRef.current.on('connected', msg => {
console.log('connected');
setUser(msg.user);
setIsConnected(true);
socketRef.current.on('message', message => {
setMessages(messages => [...messages, message]);
});
});
}, []);
const inputChangeHandler = e => setInput(e.target.value);
const sendMessage = () => {
socketRef.current.emit('newMessage', `${user}: ${input}`);
socketRef.current.on('messages', newMessages => setMessages(newMessages));
setInput('');
};
if (!isConnected) {
return <h1>Waiting for connection...</h1>;
}
return (
<div className={cx('chat-container')}>
<div className={cx('messages-container')}>
<div className={cx('message-container')}>Greetings {user}!!!</div>
{messages.map((message, index) => (
<div className={cx('message-container')} key={index}>
{message}
</div>
))}
</div>
<div className={cx('inputs-container')}>
<input
className={cx('input')}
value={input}
onChange={e => inputChangeHandler(e)}
/>
<button className={cx('send-button')} onClick={sendMessage}>
Send
</button>
</div>
</div>
);
};
export default Chat;
它应该显示“Waiting for connection...”,然后当我的代码到达时useEffect
它应该连接,然后用内容重新渲染我的组件,但我应该在每次运行 react 时手动刷新页面服务器。刷新后我的代码完全按照我的设想工作。
它似乎没有及时收到事件。
解决方案
推荐阅读
- sql - SQL Server 2012 - 动态分组
- ruby-on-rails-5 - 当我单击提交按钮时,它不会转到提到的 url。它对rails没有影响。搜索过滤器不起作用
- postgresql - Objectio.js如何设置一个连接池或者一个没有连接池的连接来共享TEMPORARY TABLE?
- vba - Outlook VBA 未更新后续标志
- vue.js - nuxt/vuetify 包中与 Vuetify 相关的 NPM 构建错误?
- python - 在熊猫数据框中的每个时间序列的第一次和最后一次出现之前和之后对 NaN 值进行切片
- django - 如何让 tox 和诗歌协同工作以支持测试 Python 依赖项的多个版本?
- r - 为什么 tryCatch 不是确定性的?
- angular - NgRx 自定义状态消毒剂
- pyspark - 如何解码在 pyspark 数据帧中十六进制编码的特殊 UTF-8 字符的字符串