Поиск по сайту:

Интеграция Vue.js и Socket.io


Веб-сокеты — это мощный способ обеспечения двунаправленной связи между клиентом и сервером, а socket.io — одна из ведущих библиотек, упрощающая обработку соединений с помощью веб-сокетов и альтернативных транспортов. Давайте объединим его с Vue, чтобы иметь возможность использовать socket.io непосредственно в наших компонентах!

Монтаж

Сначала давайте установим socket.io-client и vue-socket.io с помощью Yarn или NPM.

# Yarn
$ yarn add socket.io-client vue-socket.io
# NPM
$ npm install socket.io-client vue-socket.io --save

Применение

Для целей этого руководства мы предполагаем, что у вас уже есть сервер, работающий с socket.io локально, скажем, на порту 4113.

Сначала включите подключаемый модуль vue-socket.io в файле запуска вашего приложения:

import Vue from 'vue';
import socketio from 'socket.io';
import VueSocketIO from 'vue-socket.io';

export const SocketInstance = socketio('http://localhost:4113');

Vue.use(VueSocketIO, SocketInstance)

// The usual app stuff goes here.
...

Теперь мы можем привязываться к событиям сокета непосредственно в наших компонентах:

<template>
  <div>
    <p v-if="isConnected">We're connected to the server!</p>
    <p>Message from server: "{{socketMessage}}"</p>
    <button @click="pingServer()">Ping Server</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isConnected: false,
      socketMessage: ''
    }
  },

  sockets: {
    connect() {
      // Fired when the socket connects.
      this.isConnected = true;
    },

    disconnect() {
      this.isConnected = false;
    },

    // Fired when the server sends something on the "messageChannel" channel.
    messageChannel(data) {
      this.socketMessage = data
    }
  },

  methods: {
    pingServer() {
      // Send the "pingServer" event to the server.
      this.$socket.emit('pingServer', 'PING!')
    }
  }
}
</script>

Интеграция с Vuex

Если вы используете Vuex, вы можете запустить мутации хранилища, когда каналы сокетов получают сообщения, просто добавив свое хранилище Vuex в инициализацию плагина в main.js.

...
import { MyVuexStore } from './my-vuex-store.js'

Vue.use(VueSocketIO, SocketInstance, MyVuexStore)
...

Все мутации, вызванные сокетами, имеют префикс SOCKET_.

Так, например, если ваш канал называется messageChannel, соответствующая мутация Vuex будет SOCKET_MESSAGECHANNEL. В конфигурации вашего магазина это будет выглядеть так:


import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    isConnected: false,
    socketMessage: ''
  },

  mutations:{
    SOCKET_CONNECT(state) {
      state.isConnected = true;
    },

    SOCKET_DISCONNECT(state) {
      state.isConnected = false;
    },

    SOCKET_MESSAGECHANNEL(state, message) {
      state.socketMessage = message
    }
  }
})

Не плохо а?

Для получения более подробной информации ознакомьтесь с документацией по socket.io.