vue.js v-for list not updating

后端 未结 3 1822
挽巷
挽巷 2021-02-12 09:50

I have this list:

  • {{ list.personName }}

And th

3条回答
  •  星月不相逢
    2021-02-12 10:24

    I am not an expert on sockets, but that is not the recommended way of handling a socket connection.

    A socket sets up a persistent connection with server, and you may get data at any moment from server. Your socket.on("message", function(data) {...}) is the handler for these asynchronous data from server.

    In your sample code, your message handler seems to create a new instance of Vue() every time the server sends some data. You will quickly end up with multiple versions of Vue() instances, potentially leading to crashing user's browser tab by hogging memory.

    I do not use socket.io, but based on my understanding of web apps in general, here is how I would prefer to do it:

    // Initialize your Vue app first:
    new Vue ({
        el: '#tab',
        template: `
            
    • {{ list.personName }}
    ` data: { names: [] // start with blank, and modify later }, created: function() { // This 'created' hook is called when your Vue instance is setup // TODO: Initialize your socket connection here. // ... // Setup your socket listener mySocketInstance.on("message", response_data => { // Assuming your response_data contains 'user_names' array this.names = response_data.user_names; // Note: 'this' in the above line points to outer scope, that is why we need arrow functions }) } });

    The above code might work for you. You still have to do a lot of testing and debugging. But this is how I would expect things to work.

    Note:

    1. The code sample creates only one Vue() instance, and initializes socket listener in the created hook. So there is only one listener / handler for your socket messages.

    2. The socket message handler uses javascript arrow function which ensures that your outer scope this is same as inner scope this. Thus you will be able to update your names correctly.

提交回复
热议问题