最新文章
前端实现实时聊天功能的完整指南
发布时间:2025-06-20
热度:
// 建立WebSocket连接
const socket = new WebSocket('ws://your-server-address');
// 连接打开时
socket.addEventListener('open', (event) => {
console.log('WebSocket连接已建立');
});
// 接收消息
socket.addEventListener('message', (event) => {
const message = JSON.parse(event.data);
// 处理接收到的消息
handleNewMessage(message);
});
// 错误处理
socket.addEventListener('error', (error) => {
console.error('WebSocket错误:', error);
});
// 连接关闭时
socket.addEventListener('close', (event) => {
console.log('WebSocket连接已关闭');
});import React, { useState, useEffect } from 'react';
function ChatApp() {
const [messages, setMessages] = useState([]);
const [inputValue, setInputValue] = useState('');
const [socket, setSocket] = useState(null);
useEffect(() => {
// 组件挂载时建立WebSocket连接
const ws = new WebSocket('ws://your-server-address');
setSocket(ws);
ws.addEventListener('message', (event) => {
const newMessage = JSON.parse(event.data);
setMessages(prev => [...prev, newMessage]);
});
return () => {
// 组件卸载时关闭连接
ws.close();
};
}, []);
const handleSendMessage = () => {
if (inputValue.trim() && socket) {
const message = {
text: inputValue,
timestamp: new Date().toISOString(),
sender: 'user'
};
socket.send(JSON.stringify(message));
setInputValue('');
}
};
return (
<div className="chat-container">
<div className="messages">
{messages.map((msg, index) => (
<div key={index} className={`message ${msg.sender}`}>
{msg.text}
</div>
))}
</div>
<div className="input-area">
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()}
/>
<button onClick={handleSendMessage}>发送</button>
</div>
</div>
);
}.chat-container {
display: flex;
flex-direction: column;
height: 500px;
width: 400px;
border: 1px solid #ccc;
border-radius: 8px;
overflow: hidden;
}
.messages {
flex: 1;
padding: 10px;
overflow-y: auto;
background-color: #f9f9f9;
}
.message {
margin: 5px 0;
padding: 8px 12px;
border-radius: 18px;
max-width: 70%;
}
.message.user {
align-self: flex-end;
background-color: #007bff;
color: white;
}
.message.other {
align-self: flex-start;
background-color: #e9ecef;
}
.input-area {
display: flex;
padding: 10px;
border-top: 1px solid #ccc;
background-color: white;
}
.input-area input {
flex: 1;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
margin-right: 8px;
}
.input-area button {
padding: 8px 16px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}// 保存消息到本地存储
const saveMessages = (messages) => {
localStorage.setItem('chatMessages', JSON.stringify(messages));
};
// 从本地存储加载消息
const loadMessages = () => {
const saved = localStorage.getItem('chatMessages');
return saved ? JSON.parse(saved) : [];
};
// 在React组件中使用
useEffect(() => {
setMessages(loadMessages());
}, []);
useEffect(() => {
saveMessages(messages);
}, [messages]);// 在WebSocket连接建立后发送用户上线通知
socket.addEventListener('open', () => {
socket.send(JSON.stringify({
type: 'presence',
status: 'online',
userId: 'current-user-id'
}));
});
// 在组件卸载时发送离线通知
useEffect(() => {
return () => {
if (socket) {
socket.send(JSON.stringify({
type: 'presence',
status: 'offline',
userId: 'current-user-id'
}));
}
};
}, [socket]);// 实现WebSocket自动重连
function connectWebSocket() {
const ws = new WebSocket('ws://your-server-address');
ws.onclose = () => {
setTimeout(() => connectWebSocket(), 5000); // 5秒后重连
};
return ws;
}












冀公网安备