当前位置:首页 > VUE

vue3实现聊天

2026-02-23 13:31:04VUE

Vue3 实现聊天功能

基础项目搭建

使用 Vue CLI 或 Vite 创建 Vue3 项目:

npm init vue@latest vue-chat
cd vue-chat
npm install

安装必要依赖:

npm install socket.io-client axios

核心功能实现

前端消息组件

<template>
  <div class="chat-container">
    <div class="messages" ref="messagesRef">
      <div v-for="(msg, index) in messages" :key="index" 
           :class="['message', msg.sender === 'me' ? 'sent' : 'received']">
        {{ msg.text }}
      </div>
    </div>
    <input v-model="newMessage" @keyup.enter="sendMessage" />
  </div>
</template>

<script setup>
import { ref, onMounted, nextTick } from 'vue'
import io from 'socket.io-client'

const socket = io('http://localhost:3000')
const messages = ref([])
const newMessage = ref('')
const messagesRef = ref(null)

const sendMessage = () => {
  if (newMessage.value.trim()) {
    socket.emit('chat message', newMessage.value)
    messages.value.push({ text: newMessage.value, sender: 'me' })
    newMessage.value = ''
    scrollToBottom()
  }
}

onMounted(() => {
  socket.on('chat message', (msg) => {
    messages.value.push({ text: msg, sender: 'other' })
    scrollToBottom()
  })
})

const scrollToBottom = () => {
  nextTick(() => {
    messagesRef.value.scrollTop = messagesRef.value.scrollHeight
  })
}
</script>

<style>
.chat-container {
  max-width: 600px;
  margin: 0 auto;
}
.messages {
  height: 400px;
  overflow-y: auto;
  border: 1px solid #ccc;
  padding: 10px;
}
.message {
  margin: 5px;
  padding: 8px 12px;
  border-radius: 18px;
  max-width: 70%;
}
.sent {
  background-color: #0084ff;
  color: white;
  margin-left: auto;
}
.received {
  background-color: #e5e5ea;
  color: black;
}
</style>

Node.js 后端服务

const express = require('express')
const app = express()
const http = require('http').createServer(app)
const io = require('socket.io')(http, {
  cors: {
    origin: "http://localhost:8080",
    methods: ["GET", "POST"]
  }
})

app.get('/', (req, res) => {
  res.send('Chat Server')
})

io.on('connection', (socket) => {
  console.log('a user connected')

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

  socket.on('disconnect', () => {
    console.log('user disconnected')
  })
})

http.listen(3000, () => {
  console.log('listening on *:3000')
})

功能扩展建议

消息持久化 使用 MongoDB 或 Firebase 存储历史消息:

// 后端修改
const Message = require('./models/Message')

socket.on('chat message', async (msg) => {
  const message = new Message({ content: msg })
  await message.save()
  io.emit('chat message', msg)
})

用户认证 集成 JWT 验证用户身份:

<script setup>
import { useAuthStore } from '@/stores/auth'

const authStore = useAuthStore()
const sendMessage = () => {
  if (!authStore.isAuthenticated) return
  // ...原有发送逻辑
}
</script>

消息状态显示 添加已读/未读状态:

<div class="message-status" v-if="msg.sender === 'me'">
  {{ msg.read ? '✓✓' : '✓' }}
</div>

部署注意事项

  1. 生产环境需要配置 HTTPS

  2. 考虑使用 Nginx 反向代理

  3. 实现断线重连机制:

    // 前端socket配置
    const socket = io('http://localhost:3000', {
    reconnection: true,
    reconnectionAttempts: 5,
    reconnectionDelay: 1000
    })
  4. 添加消息加密功能保障隐私

    vue3实现聊天

以上实现方案提供了实时聊天的核心功能,可以根据具体需求进一步扩展完善。

分享给朋友:

相关文章

vue底层如何实现

vue底层如何实现

Vue 底层的核心实现机制 Vue 的底层实现主要依赖于响应式系统、虚拟 DOM 和组件化设计。以下是其关键实现原理: 响应式系统 Vue 使用 Object.defineProperty(Vue…

vue弹幕实现不重叠

vue弹幕实现不重叠

实现 Vue 弹幕不重叠的方法 CSS 定位与动画控制 通过绝对定位和动态计算弹幕轨道高度,确保弹幕在不同轨道上运行。每条弹幕占据固定高度的轨道,避免重叠。 // 弹幕轨道高度计算 const tr…

vue实现页面属性修改

vue实现页面属性修改

Vue 实现页面属性修改的方法 在 Vue 中修改页面属性可以通过多种方式实现,以下是一些常见的方法: 使用 data 属性 在 Vue 组件中,可以通过 data 选项定义页面属性,并在模板或方法…

vue实现进阶教程交流

vue实现进阶教程交流

Vue 进阶实现方法 组件化开发与复用 使用插槽(Slots)和动态组件(<component :is="">)实现灵活布局。通过provide/inject实现跨层级组件通信,避免过度依…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue 全景实现

vue 全景实现

Vue 全景实现方案 在Vue中实现全景效果,通常需要结合WebGL或第三方库来处理3D场景渲染。以下是几种常见方法: 使用Three.js库 Three.js是一个强大的WebGL库,适合创建3D…