将 Socket.io 与 Pinia 一起使用时出现问题

Issue using Socket.io with Pinia

我正在尝试使用 Pinia 来管理我正在构建的 Vue.js 应用程序中的某些全局状态,特别是我想在各种组件和视图之间共享一个 Socket.io 实例。但是我得到了

this.socketObject.emit is not a function

从 Socket.io 实例调用函数时出错,当我从 component/view 以外的组件调用它们时 Socket.io 实例是在其中创建的。这是代码的一些摘录.

@/views/LobbyView.vue(这是我创建 Socket.io 实例并将其传递给 Pinia 商店的地方,我可以使用 emit fine在这个文件中没有任何错误)

import io from "socket.io-client";
import { useSocket} from "@/store/index";
    ...     
setup() {
   const socketObject = useSocket();
   return { socketObject};
},
    ...
async mounted() {
   this.socketObject = await io("http://localhost:8000");
   this.socketObject.emit("createNewRoom");
}

@/store/index.js Pinia store

import { defineStore } from "pinia";
...
export const useSocket = defineStore({
  id: "socket",
  state: () => {
    return {socketObject: Object};
  },
  getters: {},
  actions: {},
});

@/components/lobbySettings(这是我在通过我的 Pinia 商店使用 Socket.io 时遇到问题的文件)

import { useSocket } from "@/store/index";
...
  setup() {
    const socketObject = useSocket();
    return { socketObject};
  },

...
  methods: {
    startGame() {
        this.socketObject.emit("updateRoom", this.roomInfo);
    },
  },

当按下按钮时调用开始游戏方法时,如果我发现错误,我会得到

this.socketObject.emit is not a function

我不太明白为什么 Pinia 不让我访问我的 Socket.io 实例中的函数,商店似乎可以正常处理我应用程序中的其他数据,只是无法调用这些函数。

useSocket return 是一个存储,而不是套接字实例。它应该用作:

const socketStore = useSocket();
...
socketStore.socketObject.emit(...)

io(...) 不是 return 承诺,将它与 await 一起使用在语义上是不正确的。

Object 构造函数的使用不正确。如果一个值未初始化,它可以为空:

  state: () => {
    return {socketObject: null};
  },

商店外的商店状态突变是一种不好的做法。所有状态修改都应由操作执行,这样可以通过开发工具轻松跟踪它们,这是使用商店的好处之一。

目前,在商店内包装 socketObject 没有任何好处。套接字实例可以与商店分开使用,或者套接字实例可以抽象出来并与商店操作等反应。