创建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: []
})
以上是编程学习网小编为您介绍的“Vue如何构建实时聊天和即时通讯应用?”的全面内容,想了解更多关于 vuejs 内容,请继续关注编程基础学习网。
编程基础网
本文标题为:Vue如何构建实时聊天和即时通讯应用?
基础教程推荐
猜你喜欢
- 动态加载图片路径 保持JavaScript控件的相对独立性 2023-12-15
- vue 后台返回的一维数组怎样变成二维数组 2023-10-08
- 手把手教你实现vue下拉菜单组件 2023-10-08
- axios.defaults.baseURL如何实现一个页面调用多个bas 2024-12-08
- JavaScrpt中如何使用 cookie 设置查看与删除功能 2024-01-12
- CSS3+HTML5+JS 实现一个块的收缩与展开动画效果 2024-01-17
- Ajax异步检查用户名是否存在 2023-02-14
- HTML学习第二章 2023-10-26
- 「HTML+CSS」--自定义加载动画【026】 2023-10-26
- 实例代码讲解ajax实现的无刷新分页 2022-12-18
