web建站教程
  1. 首页
  2. vuejs
  3. js
  4. 地图大全
  5. AIGC工具
  6. 前端知识
  7. 百度echarts
  8. 更多
    php入门
    nodejs
    mockjs
    reactjs
    mysql
    wordpress
    织梦cms
    帝国cms
    git教程
    IT知识
    模板大全
    休息站
    手机应用

Vue如何构建实时聊天和即时通讯应用?

974 ℃

创建Vuex Store

import Vue from 'vue'
import Vuex from 'vuex'
import io from 'socket.io-client'
 
Vue.use(Vuex)
 
export default new Vuex.Store({
  state: {
    user: {
      id: null,
      name: null
    },
    rooms: [],
    activeRoomId: null,
    messages: []
  },
  mutations: {
    setUser(state, user) {
      state.user = user
    },
    setRooms(state, rooms) {
      state.rooms = rooms
    },
    setActiveRoomId(state, roomId) {
      state.activeRoomId = roomId
    },
    addMessage(state, message) {
      state.messages.push(message)
    },
    clearMessages(state) {
      state.messages = []
    }
  },
  actions: {
    connect({ commit, dispatch }) {
      const socket = io('http://localhost:3000')
 
      socket.on('connect', () => {
        console.log('Connected to server!')
      })
 
      socket.on('user', (user) => {
        commit('setUser', user)
      })
 
      socket.on('rooms', (rooms) => {
        commit('setRooms', rooms)
      })
 
      socket.on('activeRoomId', (roomId) => {
        commit('setActiveRoomId', roomId)
      })
 
      socket.on('message', (message) => {
        commit('addMessage', message)
      })
 
      socket.on('clearMessages', () => {
        commit('clearMessages')
      })
 
      socket.on('disconnect', () => {
        console.log('Disconnected from server!')
      })
    },
    sendMessage({ state }, message) {
      const socket = io('http://localhost:3000')
 
      const payload = {
        roomId: state.activeRoomId,
        message
      }
 
      socket.emit('message', payload)
    }
  },
  modules: {
  }
})

创建Vue组件

<template>
  <div class="chat">
    <div class="chat__user">
      <h2>{{ user.name }}</h2>
    </div>
    <div class="chat__rooms">
      <ul>
        <li v-for="room in rooms" :key="room.id" @click="selectRoom(room.id)">
          {{ room.name }}
        </li>
      </ul>
    </div>
    <div class="chat__messages">
      <ul>
        <li v-for="message in messages" :key="message.id">
          {{ message.text }}
        </li>
      </ul>
    </div>
    <div class="chat__input">
      <input type="text" v-model="message">
      <button @click="sendMessage()">Send</button>
    </div>
  </div>
</template>
 
<script>
import { mapState, mapActions } from 'vuex'
 
export default {
  name: 'Chat',
  computed: {
    ...mapState(['user', 'rooms', 'activeRoomId', 'messages']),
  },
  methods: {
    ...mapActions(['connect', 'sendMessage', 'selectRoom']),
  },
  mounted() {
    this.connect()
  }
}
</script>

在服务器端实现Socket.io

const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
 
const PORT = 3000
 
http.listen(PORT, () => {
  console.log(`Server started on port ${PORT}`)
})
 
let users = []
let rooms = []
 
io.on('connection', (socket) => {
  console.log('Client connected!', socket.id)
 
  socket.on('verifyUser', (user) => {
    console.log('Verifying user', user)
 
    const authenticatedUser = {
      id: socket.id,
      name: 'Mike'
    }
 
    socket.emit('user', authenticatedUser)
  })
 
  socket.on('getRooms', () => {
    socket.emit('rooms', rooms)
  })
 
  socket.on('selectRoom', (roomId) => {
    socket.join(roomId)
    socket.emit('activeRoomId', roomId)
    socket.emit('clearMessages')
 
    const room = rooms.find(room => room.id === roomId)
    socket.emit('messages', room.messages)
  })
 
  socket.on('message', (payload) => {
    const room = rooms.find(room => room.id === payload.roomId)
 
    const message = {
      id: Date.now(),
      text: payload.message
    }
 
    room.messages.push(message)
 
    io.in(payload.roomId).emit('message', message)
  })
 
  socket.on('disconnect', () => {
    console.log('Client disconnected!', socket.id)
  })
})
 
rooms.push({
  id: '1',
  name: 'Room 1',
  messages: []
})
 
rooms.push({
  id: '2',
  name: 'Room 2',
  messages: []
})

Motion for Vue:一个轻量级且功能强大的Vue3动画库

el-table合并行的通用方法(附js代码)

vue前端分页功能实现代码(附js代码)

el-table利用:row-style="rowClass"设置指定行变色

一款免费开源效果酷炫​的 Vue / React 大屏数据展示组件库——DataV 

标签: Socket Vue即时通讯 Vue实时聊天

上面是“Vue如何构建实时聊天和即时通讯应用?”的全面内容,想了解更多关于 vuejs 内容,请继续关注web建站教程。

当前网址:https://ipkd.cn/webs_5097.html

声明:本站提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请发送到邮箱:admin@ipkd.cn,我们会在看到邮件的第一时间内为您处理!

当前位置: 首页 > vuejs
Trae:新一代免费的AI编程工具

呱呱工具箱

一款免费的在线小工具,无需下载,打开即可使用!呱呱工具箱

在线育儿补贴计算器

快来看看你到底可以领到多少补贴!生活小工具
上一篇:
下一篇:
x 打工人ai神器