当前位置: 首页 > news >正文

uni-app vue3封装websocket,支持微信小程序

一、创建useWebSocket.js 文件

// useWebSocket.js // 获取链接的URL前缀
import {BASE_URL
} from "./request";import {ref,onMounted,onBeforeUnmount
} from "vue";// 假设我们使用 uni-app 的 globalData 或 Vuex 来管理用户状态  
// 这里为了简单起见,我们假设用户ID是直接从某处获取的  const useWebSocket = (url,reconnectInterval = 10000,maxReconnectAttempts = 5
) => {const isMounted = ref(true);const isConnected = ref(false);const messages = ref([]);let reconnectAttempts = 0;const connect = () => {if (isConnected.value) {uni.closeSocket(); // 关闭已有的 WebSocket 连接  }const uri = `ws://${BASE_URL}/websocket/tender/${url}`;// 使用微信小程序的 WebSocket API  uni.connectSocket({url: uri,success: () => {console.log("WebSocket连接已打开");isConnected.value = true;// 监听消息  uni.onSocketMessage((res) => {messages.value = JSON.parse(res.data);});// 监听WebSocket的关闭  uni.onSocketClose(() => {console.log("WebSocket连接已关闭");isConnected.value = false;if (isMounted.value && reconnectAttempts < maxReconnectAttempts) {setTimeout(connect, reconnectInterval * (reconnectAttempts + 1));reconnectAttempts++;}});// 监听WebSocket的错误  uni.onSocketError((res) => {console.error("WebSocket发生错误:", res.errMsg);if (isMounted.value) {setTimeout(connect, reconnectInterval);}});},fail: (err) => {console.error("WebSocket连接失败:", err);}});};const sendMessage = (message) => {if (isConnected.value) {uni.sendSocketMessage({data: message,success: () => {console.log('消息发送成功');},fail: (err) => {console.error('发送失败', err);}});}};onMounted(() => {isMounted.value = true;connect();});onBeforeUnmount(() => {isMounted.value = false;if (isConnected.value) {uni.closeSocket();}});return {isConnected,messages,sendMessage};
};export default useWebSocket;

二、在 .vue文件中使用

<script setup>import {onLoad} from "@dcloudio/uni-app";import {ref,watchEffect} from 'vue';
// 引入useWebSocket
import useWebSocket from "@/api/useWebSocket.js";
onLoad((options) => {id.value = options.idmessages.value = useWebSocket(options.id, 10000, 5);})// 监听messages
watchEffect(() => {let timeVal = {...messages.value};console.log(timeVal);})</script>

相关文章:

  • Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理
  • linux命令之firewall-cmd用法
  • Spring Boot项目连接Oracle数据库启动报错:Undefined Error
  • 再来谈离散性,Java 比 SQL 又有什么优势?
  • 《深海迷航》风灵月影修改器进阶教程:揭秘海底无限奥秘
  • 双十一买什么东西最划算?2024年双十一好物清单分享
  • 前端框架:选择的艺术
  • 玩转图像处理:Python与OpenCV实现高效绿幕背景替换
  • 振弦式土压力计:原理、功能与应用
  • Git 工作区、暂存区和版本库
  • Electron 使用 Nodemon 配置自动重启
  • 免费的高质量、美观的甘特图模板
  • 电子数据交换EDI 835 的处理
  • 【Rockchip系列】官方函数:importbuffer_virtualaddr
  • 渗透测试入门学习——编写python脚本实现对网站登录页面的暴力破解
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【知识碎片】第三方登录弹窗效果
  • Angular4 模板式表单用法以及验证
  • CentOS7简单部署NFS
  • Github访问慢解决办法
  • JavaScript设计模式与开发实践系列之策略模式
  • js 实现textarea输入字数提示
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Python爬虫--- 1.3 BS4库的解析器
  • Vue.js-Day01
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 前端技术周刊 2019-02-11 Serverless
  • 深度学习中的信息论知识详解
  • 问题之ssh中Host key verification failed的解决
  • 异步
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (利用IDEA+Maven)定制属于自己的jar包
  • (六)DockerCompose安装与配置
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)德国人的记事本
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .gitignore文件设置了忽略但不生效
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET Micro Framework初体验(二)
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .NetCore部署微服务(二)
  • .NET下ASPX编程的几个小问题
  • .sys文件乱码_python vscode输出乱码
  • /etc/shadow字段详解