当前位置:首页 > React

React实现实时聊天

2026-01-27 17:06:53React

使用Socket.IO实现实时通信

安装Socket.IO客户端库:

npm install socket.io-client

创建Socket连接:

import io from 'socket.io-client';
const socket = io('http://your-server-url');

建立React组件结构

创建聊天室主组件:

function ChatRoom() {
  const [messages, setMessages] = useState([]);
  const [currentMessage, setCurrentMessage] = useState('');

  // 消息发送处理
  const sendMessage = () => {
    if (currentMessage.trim()) {
      socket.emit('chat message', currentMessage);
      setCurrentMessage('');
    }
  };

  return (
    <div>
      <MessageList messages={messages} />
      <MessageInput 
        value={currentMessage}
        onChange={setCurrentMessage}
        onSend={sendMessage}
      />
    </div>
  );
}

处理实时消息事件

设置消息监听:

useEffect(() => {
  socket.on('chat message', (msg) => {
    setMessages(prev => [...prev, msg]);
  });

  return () => {
    socket.off('chat message');
  };
}, []);

消息列表展示组件

创建可滚动的消息列表:

function MessageList({ messages }) {
  return (
    <div style={{ height: '400px', overflowY: 'auto' }}>
      {messages.map((msg, i) => (
        <div key={i}>{msg}</div>
      ))}
    </div>
  );
}

消息输入组件

构建带发送按钮的输入框:

function MessageInput({ value, onChange, onSend }) {
  return (
    <div>
      <input 
        type="text" 
        value={value}
        onChange={(e) => onChange(e.target.value)}
        onKeyPress={(e) => e.key === 'Enter' && onSend()}
      />
      <button onClick={onSend}>发送</button>
    </div>
  );
}

后端服务器配置

Node.js服务器示例:

const express = require('express');
const socketIo = require('socket.io');

const app = express();
const server = require('http').createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
  console.log('用户连接');

  socket.on('chat message', (msg) => {
    io.emit('chat message', msg);
  });

  socket.on('disconnect', () => {
    console.log('用户断开');
  });
});

server.listen(3001, () => {
  console.log('服务器运行在3001端口');
});

样式优化

添加基础CSS样式:

.chat-container {
  max-width: 600px;
  margin: 0 auto;
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 20px;
}

.message {
  padding: 8px 12px;
  margin: 5px 0;
  background: #f0f0f0;
  border-radius: 4px;
}

.input-area {
  display: flex;
  margin-top: 10px;
}

.input-area input {
  flex-grow: 1;
  padding: 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

.input-area button {
  margin-left: 10px;
  padding: 8px 16px;
  background: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

用户身份标识

添加用户昵称功能:

const [user, setUser] = useState('匿名用户');

// 发送消息时带上用户信息
socket.emit('chat message', {
  user,
  text: currentMessage,
  time: new Date().toLocaleTimeString()
});

消息持久化存储

使用MongoDB存储历史消息:

// 消息模型
const mongoose = require('mongoose');
const messageSchema = new mongoose.Schema({
  user: String,
  text: String,
  time: String
});
const Message = mongoose.model('Message', messageSchema);

// 保存消息
socket.on('chat message', async (msg) => {
  const newMsg = new Message(msg);
  await newMsg.save();
  io.emit('chat message', msg);
});

加载历史消息

获取存储的历史记录:

useEffect(() => {
  fetch('/api/messages')
    .then(res => res.json())
    .then(data => setMessages(data));
}, []);

React实现实时聊天

标签: 实时React
分享给朋友:

相关文章

h5实现摄像头实时播放

h5实现摄像头实时播放

使用HTML5的getUserMedia API实现摄像头实时播放 HTML5的getUserMedia API允许网页访问用户的摄像头和麦克风,实现实时视频流播放。以下是具体实现方法: 基本实现…

vue实现实时视频

vue实现实时视频

使用 Vue 实现实时视频流 在 Vue 中实现实时视频流通常涉及浏览器 API(如 getUserMedia)和视频播放组件。以下是实现方法: 获取摄像头权限并显示视频流 通过 navigator…

vue实现实时搜索

vue实现实时搜索

实现实时搜索的基本思路 在Vue中实现实时搜索功能通常需要结合v-model指令监听输入框的变化,并通过防抖(debounce)技术优化性能。以下是具体实现方法: 基础实现方式 创建Vue组件,使用…

vue实现页面实时保存

vue实现页面实时保存

Vue实现页面实时保存的方法 使用Vue实现页面实时保存功能,可以通过以下几种方式实现,具体选择取决于项目需求和复杂度。 使用watch监听数据变化 Vue的watch选项可以监听数据变化并执行回调…

vue实现实时查询

vue实现实时查询

Vue实现实时查询的方法 使用v-model和watch监听输入变化 在Vue中可以通过v-model绑定输入框的值,配合watch监听输入变化实现实时查询。 <template>…

vue实现语音实时通信

vue实现语音实时通信

实现语音实时通信的技术方案 在Vue中实现语音实时通信,可以结合WebRTC技术实现点对点(P2P)音频传输。以下是具体实现方法: 获取用户麦克风权限 使用浏览器提供的getUserMedia A…