创建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利用:row-style="rowClass"设置指定行变色
一款免费开源效果酷炫的 Vue / React 大屏数据展示组件库——DataV
上面是“Vue如何构建实时聊天和即时通讯应用?”的全面内容,想了解更多关于 vuejs 内容,请继续关注web建站教程。
当前网址:https://ipkd.cn/webs_5097.html
workflows工作流
一张科幻照片,火星车在沙漠里ComfyUI工作流
树上一个快乐的猕猴桃ComfyUI工作流
斗鸡场威武雄鸡ComfyUI工作流
一个超凡脱俗的女明星的特写镜头ComfyUI工作流
一个男孩在吃西瓜ComfyUI工作流
一条色彩斑斓的超现实小孔雀鱼ComfyUI工作流
一个戴着破旧莎帽子的机械忍者站在冰林中
一位老人安详地坐在云层中钓鱼
猜你喜欢
声明:本站提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请发送到邮箱:admin@ipkd.cn,我们会在看到邮件的第一时间内为您处理!

js导出excel插件(兼容mac电脑Numbers表格)
利用js做一个炫酷音乐背景效果
javascript如何利用draggable实现一个拖拽效果
2023年程序猿如何给自己开启一场烟花盛会
css3结合svg做一个动态广告
html5如何3D立方体旋转特效
3D彩色卡片
纯html+css做一个3d统计效果







