发布时间:2023-05-27 文章分类:WEB开发, 电脑百科 投稿人:赵颖 字号: 默认 | | 超大 打印

技术栈

  1. 前端Vue (包括一些组件、中间件)
  2. 后端分布式微服务

这里就不再详述后端是怎么开发通信服务端的了,因为我主要是后端开发,前端开发花的时间几乎是后端的两倍还要多(其实比较简单,只是自己前端真的不得行🤪)

最近在开发项目里的一个IM(实时通信)模块功能的时候发现,通过服务端转发客户端消息的时候,前端组件的数据一直没办法正常刷新,耗了很久,去查结果发现网上都没有我想要的答案(都是千篇一律的答案),最后还是没解决,那好吧,只能🪜看看了

好了,不废话了,直接上代码解决吧:

原来写法 socket.onmessage = function (event) {...}
新的写法 socket.onmessage = (event) => {...}

简单代码演示:

<template>
	<div>
		<p>{{tempContent}}</p>
	</div>
</template>
<script>
export default {
    name: "Test",
    data() {
        return {
        	socket: null, // 这里定义一个变量,因为后面有其他方法也要用到这个socket通道通信
            tempContent: 'Now is null'
        }
    },
    method: {
		initWebSocket: function() {
            // 判断浏览器是否支持WebSocket
            if (window.WebSocket) {
            	// this.GLOBAL.webSocketPath 这是一个全局变量,填的就是你的websocket的服务端通信地址
            	// 例子:this.GLOBAL.webSocketPath = ws://localhost:8080/socket
                this.socket = new WebSocket(this.GLOBAL.webSocketPath);
                // 监听消息,并将结果映射到对应标签
               this.socket.onmessage = function (ev) {
               		// 这里就自己注意转一下哈
               		console.log("==== onmessage ====")
                    let objTemp = JSON.parse(ev.data);
                    this.tempContent = objTemp.name
                    console.log(objTemp)
                    console.log(this.tempContent)
                }
              	// 其他那些监听事件就先省略了
            } else {
                console.log("当前浏览器不支持WebSocket");
            }  
        },
	},
	mounted() {
        this.initWebSocket();
    },
}
</script>

运行后,触发监听事件,并没有赋值上
Vue连接WebSocket后,监听消息并读取消息内容(onmessage事件),解决将内容赋值到data的属性失败的问题

修改代码后

<template>
	<div>
		<p>{{tempContent}}</p>
	</div>
</template>
<script>
export default {
    name: "Test",
    data() {
        return {
        	socket: null, // 这里定义一个变量,因为后面有其他方法也要用到这个socket通道通信
            tempContent: 'Now is null'
        }
    },
    method: {
		initWebSocket: function() {
            // 判断浏览器是否支持WebSocket
            if (window.WebSocket) {
            	// this.GLOBAL.webSocketPath 这是一个全局变量,填的就是你的websocket的服务端通信地址
            	// 例子:this.GLOBAL.webSocketPath = ws://localhost:8080/socket
                this.socket = new WebSocket(this.GLOBAL.webSocketPath);
                // 监听消息,并将结果映射到对应标签
               this.socket.onmessage = (ev) => {
                    console.log("==== onmessage ====")
                    let objTemp = JSON.parse(ev.data);
                    this.tempContent = objTemp.name
                    console.log(objTemp)
                    console.log(this.tempContent)
                }
              	// 其他那些监听事件就先省略了
            } else {
                console.log("当前浏览器不支持WebSocket");
            }  
        },
	},
	mounted() {
        this.initWebSocket();
    },
}
</script>

原来没有触发时的情况

Vue连接WebSocket后,监听消息并读取消息内容(onmessage事件),解决将内容赋值到data的属性失败的问题
触发之后
Vue连接WebSocket后,监听消息并读取消息内容(onmessage事件),解决将内容赋值到data的属性失败的问题