从套接字接收消息时,Vue.js 数据未更新

Sam*_* B. 2 javascript websocket vue.js

我正在尝试设计一个 vue.js 应用程序,它在从套接字接收到“new_state”消息时更新有关游戏状态的数据。套接字是使用 django 通道实现的。

这是代码的样子:

const ws_scheme = window.location.protocol == "https:" ? "wss" : "ws"

const gameSocket = new WebSocket(
    ws_scheme +
    '://'
    + window.location.host
    + '/ws/play/'
    + game_id
    + '/'
)
    let vue = new Vue({
        el: '#app',

        data: {
            current_turn: 0,
            last_turn: -1,
            current_card: 0,
            last_card: -1,
            number_of_stacked_cards: 0,
            last_amount_played: 0,
            won_by: -1,
            my_cards: [],
            other_players_data: {},
        },

        created() {
            gameSocket.onmessage = function(e) {
                data = JSON.parse(e.data)
                this.current_turn = data.state.current_turn
                this.last_turn = data.state.last_turn
               // ... update the other data
            };
        },
    });

Run Code Online (Sandbox Code Playgroud)

当我收到消息时,记录数据表明我正在接收正确的信息。但是,如果我vue.current_turn在收到消息后去输入,它仍然0不是新值;data对象的所有其他成员也是如此。我尝试过vue.current_turn = data.state.current_turn,它确实以这种方式工作,但显然它应该与this.

我的代码有什么问题?

一般来说,完成我所追求的事情的最佳方法是什么,即在从套接字接收消息时更新内部数据变量?

我必须在不使用 socket.io 库的情况下进行处理,通道不支持该库。

Ada*_*ner 5

问题是this指向任何调用gameSocket.onmessage,而不是“普通的 Vue this”。

要解决这个问题,您可以在let self = this上面执行gameSocket.onmessage并在其中使用self

  • 没问题,我们所有人都会遇到这种情况:) 是的,我认为您用来更新状态的一般方法很好。如果您愿意,您可以将其模块化,使用单独的函数来进行更新,然后将该函数分解为子函数以提高代码清晰度。例如。`updateMessage(dataFromSocket)` 然后将其分解为 `updateThisPartOfTheMessage` 和 `updateThatPartOfTheMessage`。但这并不是 Vue 特有的,只是模块化的一般编程实践。在 Vue 组件中,这些函数将位于 [`methods`](https://vuejs.org/v2/api/#methods) 中 (2认同)