vue设置全局webSocket,并在对应页面接受消息通知处理

这篇具有很好参考价值的文章主要介绍了vue设置全局webSocket,并在对应页面接受消息通知处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近项目中有用到了webSocket,然后在收到消息之后需要在不同的页面进行处理。所有就需要在不同的页面监听并进行对应的消息处理。

首先,在app.vue中添加socket初始化,并设置发送消息,接收消息和心跳检测的处理。

// App.vue
export default {
	data() {
		return {
			// socket参数
			socket: null,
			timeout: 10 * 1000, // 45秒一次心跳
			timeoutObj: null, // 心跳心跳倒计时
			serverTimeoutObj: null, // 心跳倒计时
			timeoutnum: null, // 断开 重连倒计时
			lockReconnect: false, // 防止
			websocket: null
		};
	},
    mounted() {
		this.initWebSocket(userId); // userId为socket链接的参数
	},
    methods:{
        initWebSocket(supplierId) {
			// WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https
			let wsUrl = `wss://192.168.1.33/rest/supplier-api/wss/websocket/${userId}`;
			this.websocket = new WebSocket(wsUrl);
			this.websocket.onopen = this.websocketonopen;
			this.websocket.onerror = this.websocketonerror;
			this.websocket.onmessage = this.setOnmessageMessage;
			this.websocket.onclose = this.websocketclose;
            // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
            // window.onbeforeunload = that.onbeforeunload
		},
		start() {
			console.log('start');
			//清除延时器
			this.timeoutObj && clearTimeout(this.timeoutObj);
			this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
			this.timeoutObj = setTimeout(() => {
				if (this.websocket && this.websocket.readyState == 1) {
					this.websocket.send('heartBath');//发送消息,服务端返回信息,即表示连接良好,可以在socket的onmessage事件重置心跳机制函数
				} else {
					this.reconnect();
				}
				//定义一个延时器等待服务器响应,若超时,则关闭连接,重新请求server建立socket连接
				this.serverTimeoutObj = setTimeout(() => {
					this.websocket.close();
				}, this.timeout)
			}, this.timeout)
		},
		reset() { // 重置心跳
			// 清除时间
			clearTimeout(this.timeoutObj);
			clearTimeout(this.serverTimeoutObj);
			// 重启心跳
			this.start();
		},
		// 重新连接
        reconnect() {
			if (this.lockReconnect) return
			this.lockReconnect = true;
			//没连接上会一直重连,设置延迟避免请求过多
            this.timeoutnum && clearTimeout(this.timeoutnum);
            this.timeoutnum = setTimeout(() => {
				this.initWebSocket();
                this.lockReconnect = false;
            }, 5000)
        },
		async setOnmessageMessage(event) {
			console.log(event.data, '获得消息');
			this.reset();
			// 自定义全局监听事件
			window.dispatchEvent(new CustomEvent('onmessageWS', {
				detail: {
					data: event.data
				}
			}))
			// //发现消息进入    开始处理前端触发逻辑
			// if (event.data === 'success' || event.data === 'heartBath') return
        },
		websocketonopen() {
            //开启心跳
            this.start();
            console.log("WebSocket连接成功!!!"+new Date()+"----"+this.websocket.readyState);
		},
		websocketonerror(e) {                
			console.log("WebSocket连接发生错误" + e);              
		},
		websocketclose(e) {
            this.websocket.close();
            clearTimeout(this.timeoutObj);
			clearTimeout(this.serverTimeoutObj);
            console.log("WebSocket连接关闭");
		},
        websocketsend(messsage) {
            that.websocket.send(messsage)
        },
        closeWebSocket() { // 关闭websocket
            that.websocket.close()
        },
    }

其中:在接收到消息之后需要自定一个监听事件,来供页面去监听消息通知。

async setOnmessageMessage(event) {
	console.log(event.data, '获得消息');
	this.reset();
	// 自定义全局监听事件
	window.dispatchEvent(new CustomEvent('onmessageWS', {
		detail: {
			data: event.data
		}
	}))
	// //发现消息进入    开始处理前端触发逻辑
	// if (event.data === 'success' || event.data === 'heartBath') return
},

最后在需要使用的页面添加监听事件

mounted () {
	// 添加socket通知监听
	window.addEventListener('onmessageWS', this.getSocketData)
},
methods: {
    // 收到消息处理
	getSocketData (res) {
		if (res.detail.data === 'success' || res.detail.data === 'heartBath') return
		// ...业务处理
	},
}

至此,vue配置全局socket的需求就完成了。欢迎大佬们一起讨论文章来源地址https://www.toymoban.com/news/detail-512458.html

到了这里,关于vue设置全局webSocket,并在对应页面接受消息通知处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序统一分享,全局接管页面分享消息的一些技巧

    前言 最近都在折腾自己的个人内容聚合小程序。除了作为原创专栏,视频教程的聚合。我有什么新的想法,产品创意,最终落地的东西都会放到这个小程序里。 而分享功能非常的重要,当某一个功能或文章打动用户的时候,能把这个小程序分享出去,就能带来裂变传播的效

    2024年02月15日
    浏览(52)
  • Vue3封装全局WebSocket;全局可监听、可发送、心跳处理等;

    操作如下 可以在多个页面多个组件中进行监听/发送 代码简介 方便; 首先安装 tools-javascript 以及 tools-vue3 根据你的业务需求初始化 ws 在你的任何文件中直接调用即可 附加篇(也可不读 直接看文档 )

    2024年02月11日
    浏览(41)
  • 微信小程序全局分享转发实现-无需页面单独设置

    微信小程序没有自带全局分享设置,页面开启分享功能必须要在页面中定义分享事件函数onShareAppMessage(分享给朋友)和onShareTimeline(分享至朋友圈)。如果项目中页面比较多,一个个去设置无疑是非常麻烦的,因此全局设置就非常有必要了。 此时我们将代码放在app.js中,注

    2024年02月16日
    浏览(53)
  • Vue 项目中使用WebSocket 消息推送

    1.这是我在后台管理项目中使用到的,主要的作用是搞一个消息提醒的功能。 2.主要有右上角的提示和有下角的消息弹框。 3.主要实现的功能是如果用户有未读的消息,那么首次登录就弹框,如果用户关闭了页面,那么再次刷新页面的时候,也不再弹框,意思就是一个账户没

    2024年02月11日
    浏览(42)
  • 【Vue项目实战】之WebSocket消息监听

    前言 哈喽!CSDN! 很久以前有位好朋友就建议来CSDN做一些笔记,直到最近又被提醒了一次,这次终于想起来了, 好习惯还是需要一个好的开始 ╭(●`∀´●)╯,感谢这位好朋友让我拥有这个好习惯 ╭(′▽ )╭(′▽ )╯ 这位好朋友的博客链接如下: 点击进入 由于业务需求

    2024年01月17日
    浏览(38)
  • 本地存储、自定义事件、全局事件总线、消息订阅与发布【Vue】

    存储内容大小一般支持5MB左右(不同浏览器可能还不一样) 浏览器通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制 相关API: (1) xxxxStorage.setItem(\\\'key\\\', \\\'value\\\'); 该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。

    2023年04月21日
    浏览(40)
  • SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息

    1、https://www.mchweb.net/index.php/dev/887.html 2、https://itonline.blog.csdn.net/article/details/81221103?spm=1001.2101.3001.6661.1utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1-81221103-blog-121078449.pc_relevant_aadepth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~default-1-81221103-blog-12107

    2024年02月05日
    浏览(47)
  • Web前端 ---- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

    目录 前言 父子组件 父传子 子传父 全局事件总线 什么叫全局事件总线 如何创建全局事件总线 如何在组件上获取到这个全局vc对象 最常用的创建全局事件总线 兄弟组件 消息订阅与发布 安装 使用 爷孙组件 在上篇文章我们介绍了父子组件之间的传值通信,本文将介绍不仅限

    2024年02月05日
    浏览(46)
  • vue+springboot+websocket实现消息通知,含应用场景

    vue、springboot 实现场景 点击同步之后更新数据,更新时间比较长,因此使用异步,之后该按钮置灰,在数据更新完成之后,服务端通知客户端已经同步成功,通知提示框,用户即可查看数据 前端 1、在对应的页面编写初始化、连接成功,错误,接受信息方法 2、mounted或者cre

    2024年02月11日
    浏览(77)
  • vue设置全局样式:loadOptions

    vue中全局设置样式有两种方法 : ** 1. 第一种:只需要在main.js中引入 ** 如global.css html,body,#app{ height: 100%; margin: 0px; padding: 0px; } 在main.js中引入 import “./styles/index.scss”; import ‘./assets/css/global.css’ import ‘./assets/fonts/iconfont.css’ 这样所有的vue组件都有了这个公共样式。 2. 第二

    2023年04月08日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包