Vue.js 在 websocket onmessage 事件中更新 html

Posted

技术标签:

【中文标题】Vue.js 在 websocket onmessage 事件中更新 html【英文标题】:Vue.js updating html inside websocket onmessage event 【发布时间】:2021-07-26 06:49:00 【问题描述】:

我是 Vue.js 新手。我正在尝试在 websocket 的 onmessage 事件中捕获数据并更新 html 组件(跨度或 div)。 console.log 或 alert 函数在 onmessage 中工作,但无法更新 span。

开头有一个模板部分,其中包含一个输入框(消息),一个按钮触发发送消息,以及一个与结果绑定的跨度。

<template>
  <div id="app">
    <h2>Vue.js WebSocket</h2> 
    <input v-model="message" placeholder="Type command here"/>
    <button v-on:click="sendMessage()">Send Message</button><br><br>
    <span v-text="result"></span>
  </div>
</template>

这里是脚本部分;

<script>
export default 
  name: 'App',
  
  data: function () 
    return 
      connection:null,
      message:"",
      result:null
    
  ,

  methods: 
    sendMessage: function() 
      console.log("Sent command:" + this.message);
      console.log(this.connection);
      this.connection.send(this.message);
    ,
  ,

  created: function() 
    console.log("Starting connection to WebSocket Server");
    this.connection = new WebSocket("ws://localhost:3000");
    
    //THAT WORKS
    this.result = "Result of command";

    this.connection.onmessage = function(event) 
      console.log(event);
    
    this.connection.onopen = function(event) 
      console.log(event);
      console.log("Successfully connected to the echo websocket server...")
    
    this.connection.onmessage = function(event) 
      //THAT WORKS
      console.log("Resultttt:" + event.data);
      
      //THAT DOESN'T WORK
      this.result = event.data;
    
    this.connection.onopen = function(event) 
      console.log(event);
      console.log("Successfully connected to the echo websocket server...");
    
  

</script>

【问题讨论】:

模板在哪里?究竟是什么不工作?请看minimal reproducible example 添加了模板部分。 this.result = event.data 行在 this.connection.onmessage 中不起作用,但 event.data 不是未定义的。 console.log 打印它的值。 【参考方案1】:

这可能是上下文问题。尝试如下更改,看看是否有效。

this.connection.onmessage = (event) => 
  // no new context ----------------^
  this.result = event.data;

const v = this;
this.connection.onmessage = function(event) 
  v.result = event.data;

【讨论】:

以上是关于Vue.js 在 websocket onmessage 事件中更新 html的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 在 websocket onmessage 事件中更新 html

带有 Websocket 或 Socket.io 的 Vue.js 实时图表

如何将 websocket 实例传递给 vue.js 组件,然后在其上调用 send()?

通过 Laravel 中的 websocket 收到通知后,Vue.js 组件未更新

如何解决Vue.js里面noVNC的截图问题——蛋疼的cookies验证和node.js的websocket代理

如何解决Vue.js里面noVNC的截图问题——论可以跨域的webSocket