在 vuejs 和 vuex 上重复 websocket 的发射

Posted

技术标签:

【中文标题】在 vuejs 和 vuex 上重复 websocket 的发射【英文标题】:Emit of websocket is repeaded on vuejs and vuex 【发布时间】:2019-12-07 13:11:28 【问题描述】:

vuex 文件中有一个函数,如下所示。 当我使用 Vue 组件的“按钮”运行启动功能时, socket.emit 将数据发送到 nodejs 的 socker。 它通过nodejs的websocket通过socket.on接收一些结果。

// In vuex.js

const actions = 
   start(event)     
       socket.emit("voice", 
         msg: event.currentTarget.message
       );

       socket.on("voice-reply", result => 
          console.log(result);
  );

但是当我使用 vuejs 的按钮运行这个启动功能时, socket.on("voice-reply") 再重复一次。 例如,

console.log(result)

点击按钮后,

console.log(result)
console.log(result)

点击按钮后,

console.log(result)
console.log(result)
console.log(result)

它是这样运行的。您能解释一下为什么 socket.on 会再增加一次吗? 非常感谢您阅读。

【问题讨论】:

【参考方案1】:

socket.on 创建一个eventListener,每次发出事件时都会触发它。通过在您的start 操作中包含socket.on,您将在每次调用start(通过单击按钮)时创建一个新的eventListener,并且每个侦听器都会记录到控制台。您不应该在发出事件的同一块中创建侦听器。

创建一个像setupListeners 这样的新操作,并且只从其他地方调用一次,可能在您的组件中(例如在created 生命周期挂钩中)或从其他操作:

const actions = 
    start(event)     
        socket.emit("voice", 
            msg: event.currentTarget.message
        );
    ,
    setupListeners() 
        socket.on("voice-reply", result => 
            console.log(result);
        );
    

【讨论】:

以上是关于在 vuejs 和 vuex 上重复 websocket 的发射的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中对 vuejs 文件的 Vuex 调用函数

如何在带有 vuetify 和 vuex 的 Vuejs 项目中使用 Jest?节点模块和 Vuetify 问题

VueJS v3、Vuex 和 Composition API 以及输入字段上的 v-model

Vuex 和 VueJS(不要在突变处理程序之外改变 vuex 存储状态)

VueJS从Vuex返回值不起作用

Vuex/Vuejs:在 vuex 存储中访问 localStorage