2017-10-10 4 views
0

私はプロジェクトに貢献したい - それはVueで書かれており、私はVueの初心者です。どちらがWebSocketの異なるメッセージに基づいて、いくつかの状態を更新する必要がありますSetupMainAppvue:websocket listenerからグローバルイベントを出す

-

私は2つのコンポーネントがあります。いくつかのwebsocketメッセージは、前者に影響を与えます。

Vueはサービスを知らないので、空の<template>というカスタムコンポーネントを作成すると思いました。そのWebSocketをインスタンス化し、リスナーで新しいメッセージが発生するたびにthis.emit()を発行します。

他の両方のコンポーネントが発光を聞いて反応することができます。

残念ながら、私はwebsocketコンポーネントを動作させることができません。

main.js:

import Ws from './WsService.vue'; 
//other imports 

const routes = [ 
    //routes 
] 


const router = new VueRouter({ 
    routes // short for `routes: routes` 
}) 

const app = new Vue({ 
    router 
}).$mount('#app') 
//I thought this to be the way to instantiate my webSocket service: 
const WsService = new Vue({ 
    el: '#WsService', 
    components: { Ws } 
}); 

index.htmlを

<body> 
    <div id="app"> 
     <div id="WsService"></div> 
     <router-link to="/setup">Setup</router-link> 
     <router-link to="/main-app">Main App</router-link> 
     <router-view></router-view> 
    </div> 
    <script src="/dist/demo-app.js"></script> 
    </body> 

のWebSocket "サービス":

<template> 
</template> 

<script> 
const PORT_LOCAL = 9988; 
var ws = new WebSocket("ws://localhost:" + PORT_LOCAL); 
ws.onopen = function() { 
    ws.send('{"jsonrpc":"2.0","id":"reg","method":"reg","params":null}'); 
}; 

ws.onerror = function(e) { 
     console.log("error in WebSocket connection!"); 
     console.log(e); 
}; 

export default { 

    data() { 
    return { 
    } 
    }, 

    created() { 
    var self = this; 
    ws.onmessage = function(m) { 
      var msg = JSON.parse(m.data); 
      switch(msg.id) { 
      // result for address request 
      case "reg": 
       self.$emit("reg_received", msg.result); 
       break; 
      case "send": 
       self.$emit("send_received", msg.result); 
       break; 
      case "subscribe": 
       self.$emit("subscribe_received", msg.result); 
       break; 
      default: 
       console.log(msg); 
       break; 
      } 
    } 
    }, 

    methods: { 
    }, 

    send(id, method, params) { 
    ws.send('{"jsonrpc":"2.0","id":"' + id + '","method":"' + method + '","params":null}'); 

    } 
    } 

} 
</script> 

メインアプリから例えば送信(これが動作しているようです) :

import WsSvc from './WsService.vue'; 
export default { 
    data() { 
    // 
    }, 
    subscribe() { 
    let jsonrpc = "the jsonrpc string"; 
    WsSvc.send(jsonrpc); 
    } 
} 

emitに聞く:

export default { 
    data() { 
    // 
    }, 
    created() { 
    this.$on("reg_received", function(result){ 
     //do smth with the result 
    }); 

    } 
} 

ウィットこの構成、createdフックが実際に呼び出されることは決してありません - ので、私はonmessageリスナーを打つことは決してないだろう。私が思ったカスタムコンポーネントを持っている理由は、私がemit関数にアクセスできるということでした。

私はそれをもっと複雑にしていると感じていますが、私はまだそれを正しく管理していません。ソリューションはこのアプローチに従う必要はありません。

+0

"Vueがサービスを知りません"。これは本当に正しいわけではありません。 APIをビルドし、使用するコンポーネントにインポートしてください。ここにコンポーネントは必要ありません。 – Bert

+0

@Bertあなたが正しいかもしれませんが、問題は、onmessageからコールバックして他のコンポーネントのプロパティを更新する方法よりも、APIが少なくて済みます。 – faboolous

+1

これはいかがですか? https://codesandbox.io/s/4wp90vvr2w – Bert

答えて

1

のコンポーネントの場合は、この場合は特に指定する必要はありません。私が過去にいくつかのプロジェクトで行ったことは、ソケットメッセージを処理し、そのAPIまたはストアを必要なコンポーネントにインポートするAPIまたはストアオブジェクトを実装することです。またin a similar answer、私はWebSocketをVuexと統合する方法を示します。

Vueをイベントエミッタとして使用するコンセプトと、任意のコンポーネントにインポートできるWebソケットを組み合わせた例を次に示します。コンポーネントは、聴きたいメッセージを購読して聞くことができます。このようにソケットをラップすると、未処理のソケットインタフェースが抽象化され、より一般的にはVue形式で$ on/$ offサブスクリプションを処理できます。ここ

Socket.js

import Vue from "vue" 

const socket = new WebSocket("wss://echo.websocket.org") 

const emitter = new Vue({ 
    methods:{ 
    send(message){ 
     if (1 === socket.readyState) 
     socket.send(message) 
    } 
    } 
}) 

socket.onmessage = function(msg){ 
    emitter.$emit("message", msg.data) 
} 
socket.onerror = function(err){ 
    emitter.$emit("error", err) 
} 


export default emitter 

コンポーネントで使用されるコードの一例です。

アプリケーション。VUE

<template> 
    <ul> 
    <li v-for="message in messages"> 
     {{message}} 
     </li> 
    </ul> 
</template> 

<script> 
    import Socket from "./socket" 

    export default { 
     name: 'app', 
     data(){ 
      return { 
       messages: [] 
      } 
     }, 
     methods:{ 
      handleMessage(msg){ 
      this.messages.push(msg) 
      } 
     }, 
     created(){ 
      Socket.$on("message", this.handleMessage) 
     }, 
     beforeDestroy(){ 
      Socket.$off("message", this.handleMessage) 
     } 
    } 
</script> 

そして、ここではworking exampleです。

0

ねえ、これは、より良いあなたのために働く必要があると簡単

この私の例.vueファイルと

yourVueFile.Vue

<template> 
// key in your template here 
</template> 

<script> 
export default { 
//use the created() option to execute after vue instance is created 
    created() { 
    let ws = new WebSocket("yourUrl"); 
    ws.onopen = e => { 
     ws.send(
     JSON.stringify({ your json code }) 
    ); 

     ws.onmessage = e => { 
     let data = JSON.parse(e.data); 

// the this.$data get your data() options in your vue instance 
      this.$data.dom = data; 

     }; 
    }; 
    }, 
    data() { 
    return { 
     dom: core 
    }; 
    }, 
    methods: { 

    } 
}; 
</script>