Vue3.0中websocket的使用-demo

作者:JackieDYH日期:2025/10/16

Vue3 中使用 WebSocket 的详细实现指南,基于 Composition API 和 ​​<script setup>​​ 语法

一、基础实现(Composition API)

1<script setup>
2import { ref, onMounted, onBeforeUnmount } from 'vue'
3
4const messages = ref([])
5const inputMsg = ref('')
6let ws = null
7
8// 初始化 WebSocket
9const initWebSocket = () => {
10  ws = new WebSocket('wss://your-websocket-url')
11
12  ws.onopen = () => {
13    console.log('WebSocket connected')
14    sendMessage({ type: 'auth', token: 'your_token' })
15  }
16
17  ws.onmessage = (event) => {
18    const data = JSON.parse(event.data)
19    messages.value.push(data) // 使用 .value 修改 ref
20  }
21
22  ws.onerror = (error) => {
23    console.error('WebSocket error:', error)
24  }
25
26  ws.onclose = (event) => {
27    console.log('WebSocket closed:', event.reason)
28  }
29}
30
31// 发送消息
32const sendMessage = (message) => {
33  if (ws?.readyState === WebSocket.OPEN) {
34    ws.send(JSON.stringify(message))
35  }
36}
37
38// 组件挂载时初始化
39onMounted(() => {
40  initWebSocket()
41})
42
43// 组件卸载时关闭连接
44onBeforeUnmount(() => {
45  ws?.close()
46})
47</script>

二、进阶封装(自定义 Composable)

创建 ​​useWebSocket.js​​:

1// composables/useWebSocket.js
2import { ref, onBeforeUnmount } from 'vue'
3
4export default function useWebSocket(url) {
5  const messages = ref([])
6  const isConnected = ref(false)
7  let ws = null
8
9  const connect = () => {
10    ws = new WebSocket(url)
11
12    ws.onopen = () => {
13      isConnected.value = true
14      console.log('WebSocket connected')
15    }
16
17    ws.onmessage = (event) => {
18      messages.value.push(JSON.parse(event.data))
19    }
20
21    ws.onerror = (error) => {
22      console.error('WebSocket error:', error)
23      isConnected.value = false
24    }
25
26    ws.onclose = () => {
27      isConnected.value = false
28      console.log('WebSocket closed')
29    }
30  }
31
32  const send = (data) => {
33    if (ws?.readyState === WebSocket.OPEN) {
34      ws.send(JSON.stringify(data))
35    }
36  }
37
38  const close = () => {
39    ws?.close()
40  }
41
42  // 自动重连逻辑
43  const reconnect = () => {
44    if (!isConnected.value) {
45      setTimeout(() => {
46        console.log('Reconnecting...')
47        connect()
48      }, 3000)
49    }
50  }
51
52  onBeforeUnmount(close)
53
54  return {
55    messages,
56    isConnected,
57    connect,
58    send,
59    close,
60    reconnect
61  }
62}

在组件中使用:

1<script setup>
2import useWebSocket from '@/composables/useWebSocket'
3
4const { messages, isConnected, send } = useWebSocket('wss://your-url')
5
6// 组件挂载时连接
7onMounted(() => {
8  connect()
9})
10
11// 发送示例
12const handleSend = () => {
13  send({ type: 'message', content: 'Hello' })
14}
15</script>

三、最佳实践升级

1. 自动重连 + 心跳检测
1// 在 composable 中添加
2let reconnectAttempts = 0
3const maxReconnectAttempts = 5
4let heartbeatInterval = null
5
6const startHeartbeat = () => {
7  heartbeatInterval = setInterval(() => {
8    if (ws?.readyState === WebSocket.OPEN) {
9      send({ type: 'ping' })
10    }
11  }, 30000)
12}
13
14// 修改 connect 方法
15ws.onopen = () => {
16  isConnected.value = true
17  reconnectAttempts = 0
18  startHeartbeat()
19}
20
21ws.onclose = () => {
22  isConnected.value = false
23  clearInterval(heartbeatInterval)
24  if (reconnectAttempts < maxReconnectAttempts) {
25    reconnect()
26    reconnectAttempts++
27  }
28}
2. 使用 WebWorker 处理数据(可选)
1// 在 composable 中
2const worker = new Worker('/websocket.worker.js')
3
4ws.onmessage = (event) => {
5  worker.postMessage(event.data)
6}
7
8// worker.js
9self.onmessage = (e) => {
10  const data = JSON.parse(e.data)
11  // 执行复杂数据处理
12  self.postMessage(processedData)
13}

四、与 Pinia 集成

1. 创建 WebSocket Store
1// stores/websocket.js
2import { defineStore } from 'pinia'
3
4export const useWebSocketStore = defineStore('websocket', {
5  state: () => ({
6    messages: [],
7    isConnected: false
8  }),
9  actions: {
10    handleMessage(data) {
11      this.messages.push(data)
12    },
13    setConnectionStatus(status) {
14      this.isConnected = status
15    }
16  }
17})
2. 在 Composable 中使用 Store
1import { useWebSocketStore } from '@/stores/websocket'
2
3export default function useWebSocket(url) {
4  const store = useWebSocketStore()
5
6  // 修改消息处理
7  ws.onmessage = (event) => {
8    const data = JSON.parse(event.data)
9    store.handleMessage(data)
10  }
11
12  // 修改连接状态
13  ws.onopen = () => {
14    store.setConnectionStatus(true)
15  }
16}

五、完整示例(实时聊天)

1<template>
2  <div class="chat-container">
3    <div v-for="(msg, index) in messages" :key="index" class="message">
4      <strong>{{ msg.user }}:</strong> {{ msg.content }}
5    </div>
6    <input 
7      v-model="inputMsg" 
8      @keyup.enter="sendMessage"
9      placeholder="输入消息..."
10    />
11    <button @click="sendMessage">发送</button>
12  </div>
13</template>
14
15<script setup>
16import { ref, onMounted } from 'vue'
17import useWebSocket from '@/composables/useWebSocket'
18
19const { messages, send, connect } = useWebSocket('wss://chat-server')
20const inputMsg = ref('')
21
22const sendMessage = () => {
23  if (inputMsg.value.trim()) {
24    send({
25      user: '用户',
26      content: inputMsg.value
27    })
28    inputMsg.value = ''
29  }
30}
31
32onMounted(() => {
33  connect()
34})
35</script>

六、TypeScript 支持

1// composables/useWebSocket.ts
2import { ref, onBeforeUnmount } from 'vue'
3
4interface WebSocketMessage {
5  type: string
6  [key: string]: any
7}
8
9export default function useWebSocket(url: string) {
10  const messages = ref<WebSocketMessage[]>([])
11  const isConnected = ref(false)
12  let ws: WebSocket | null = null
13
14  // ...其他实现保持相同,添加类型注解...
15}

注意事项

  1. SSR 兼容:在 Nuxt 等 SSR 框架中需判断 ​​window​​ 对象存在
  2. 响应式优化:大数据量时使用 ​​shallowRef​​ 避免深度响应
  3. 错误边界:添加全局错误捕获
1window.addEventListener('unhandledrejection', (event) => {
2  // 处理 WebSocket 相关错误
3})

4**.浏览器限制**:注意同一域名下的并发连接数限制(Chrome 为 255)


Vue3.0中websocket的使用-demo》 是转载文章,点击查看原文


相关推荐


1+x web初级证书前端框架基础概念的知识点
期待~明天2025/10/14

1+X Web初级证书前端框架基础概念知识点 核心框架概念 组件化开发:将UI拆分为独立可复用的组件,每个组件包含自身的逻辑与样式,如React的JSX或Vue的单文件组件。虚拟DOM:通过内存中的轻量级DOM描述优化渲染性能,框架自动计算最小更新差异(如React的Reconciliation算法)。数据绑定:实现视图与数据的自动同步,分为单向(React)和双向(Vue的v-model)绑定。状态管理:集中管理应用状态,常用方案如React的Redux/Vuex,或Context API


记录一次在Win7系统中使用C#中的HttpWebRequest连接缓慢、超时等问题(httpclient和restsharp也存在同样的问题)
星火燎猿2025/10/13

一、测试代码 string result; try { HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);


​​Auslogics Registry Cleaner (注册表优化专家) 深度扫描与安全修复​​ 便携版
awf234ffw2025/10/11

获取地址:Auslogics Registry Cleaner(注册表清理工具) Auslogics Registry Cleaner 是一款专业的Windows注册表清理工具,能够深度检测无效条目、冗余键值及错误配置,提升系统稳定性。 软件采用安全备份机制,在清理前自动创建还原点,支持自定义扫描范围与一键修复功能。通过定期优化注册表,可有效解决系统卡顿、程序冲突等问题,适合需要维护系统性能的用户。


突破速度障碍:非阻塞启动画面如何将Android 应用启动时间缩短90%
稀有猿诉2025/10/10

本文译自「Breaking the Speed Barrier: How Non-Blocking Splash Screens Cut Android App Launch Time by 90%」,原文链接sankalpchauhan.com/breaking-th…,由Sankalp Chauhan发布于2025年9月28日。 概述 正值佳节期间,我们在每个应用上都能看到精美的启动画面和自定义徽标。在开发这些应用时,每个 Android 开发者都会面临启动画面的困境:用户期望获得美观且品


第8章:定时任务与触发器——让 Bot 主动服务
芝麻开门-新起点2025/10/8

8.1 什么是定时任务? 在之前的章节中,我们的 Bot 都是被动响应用户的输入。用户提问,Bot 回答。但很多时候,我们希望 Bot 能够主动在特定时间执行任务,例如每天早上发送天气预报、定时提醒用户喝水、或者定期从网站抓取数据并汇报。这就是定时任务 (Scheduled Task) 的用武之地。 Coze 中的定时任务功能,允许你设置一个触发器 (Trigger),当满足预设的时间条件时,自动运行指定的 Bot 或工作流。这极大地扩展了 Bot 的应用场景,使其从一个问答工具变成了一个可以


【Node】单线程的Node.js为什么可以实现多线程?
你的人类朋友2025/10/7

前言 很多刚接触 Node.js 的开发者都会有一个疑问:既然 Node.js 是单线程的,为什么又能使用 Worker Threads 这样的多线程模块呢? 今天我们就来解开这个看似矛盾的技术谜题。 👀 脑海里先有个印象:【Node.js 主线程】是单线程的,但【可以通过其他方式】实现并行处理 什么是 Node.js 的"单线程"? 事件循环(Event Loop)机制 // 这是一个简单的 Node.js 程序 console.log('开始执行') setTimeout(() =>


Vue2 动态添加属性导致页面不更新的原因与解决方案
excel2025/10/6

在 Vue2 开发中,经常会遇到这样一个问题:对象新增属性后,数据虽然更新了,但页面并没有随之更新。本文将通过一个例子来说明原因,并给出解决方案。 一、问题示例 我们先来看一个简单的例子: <div id="app"> <p v-for="(value, key) in item" :key="key"> {{ value }} </p> <button @click="addProperty">动态添加新属性</button> </div> Vue 实例代码如下: co


重新定义创意边界:Seedream 4.0深度测评——从个人创作到企业级生产的AI图像革命
一个天蝎座白勺程序猿2025/10/4

一、引言:AI图像创作的“奇点时刻”” 2025年的AI赛道,图像生成领域正经历一场“效率革命”。从Midjourney的写实风格到DALL·E 3的语义理解,技术迭代速度远超行业预期。然而,用户痛点始终存在: 创作流程割裂:生成、编辑、排版需切换多个工具,设计师日均耗时超3小时在“导出-导入”的重复操作中;一致性失控:多图合成时,人物比例、光影逻辑、风格统一性常需手动修正,电商海报批量生产效率低下;企业部署门槛高:私有化部署成本高昂,API调用缺乏行业适配方案,中小团队难以规模化应用。


使用Claude Code Router轻松切换各种高性价比模型
小溪彼岸2025/10/3

前言 前段时间随着Claude Code CLI的爆火也随之火了一款Claude Code CLI扩展Claude Code Router,该扩展工具可以很方便的将各大主流模型接入到Claude Code CLI中使用(那段时间国内各大模型还没有支持Claude Code CLI,Claude Code CLI只能使用Claude Code模型),今天我们也来了解一下这款神奇的工具。对往期内容感兴趣的小伙伴也可以看往期内容: Claude Code CLI初体验 不习惯终端黑窗口?Claude


Scrapy 重构新选择:scrapy_cffi 快速上手教程
两只好2025/10/2

随着爬虫场景的不断升级,Scrapy 虽然成熟稳定,但在异步支持、WebSocket 和现代请求库等方面有一些局限。 scrapy_cffi 是在 Scrapy 风格基础上重构的异步爬虫框架,支持更现代的请求库、扩展机制和异步 DB/MQ 管理。 通过这篇教程,你可以快速创建自己的异步爬虫项目,并体验框架的核心特性。 1.为什么要重构 Scrapy Scrapy 本身虽然功能强大,但存在一些痛点: IDE 提示有限:代码提示和补全不够友好 异步支持弱:asyncio 协程能力有限,WebSo

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0