vuex-socketio v0.3.7
vuex-socketio
Vuex plugin for Socket.io-client.
Install
npm install vuex-socketio --saveUsage
Configuration
One socket.io-client instance
import createSocketIoPlugin from 'vuex-socketio';
const socket = socketio('http://socketserver.com:3001');
const socketPlugin = createSocketIoPlugin(socket);With namespace:
import createSocketIoPlugin from 'vuex-socketio';
const socket = socketio('http://socketserver.com:3001');
const socketNsp = socketio('http://socketserver.com:3001/namespace');
const socketPlugin = createSocketIoPlugin([socket, socketNsp]);In store:
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
...
},
plugins: [socketPlugin]
})Vuex Store integration
Set up listeners
You may define prefix for socket.on with options object:
const socketPlugin = createSocketIoPlugin(socket, {onPrefix: 'someOnPrefix'});The default value is socketOn
mutations: {
socketOnConnect: (state, status ) => {
state.connect = true;
},
socketOnMessage: (state, message) => {
state.message = message;
},
...
},
actions: {
socketOnOtherMessage: (context, message) => {
...some code here
},
...
}Where socketOn is a prefix for listeners and message is a desired channel name
Set up emiters
Only actions can be used for emitting to socket
Define socket.emit prefix:
const socketPlugin = createSocketIoPlugin(socket, {emitPrefix: 'someEmitPrefix'});Or use the default value: socketEmit
actions: {
socketEmitMessage: (context, message) => {},
...
}Where socketEmit is a prefix for emitting messages and message is a desired channel name
Open and close socket connection
Use: socketConnect && socketDisconnect actions
You can also add some prefixes for default functions, e.g.: socketReconnect,
where socket is a mandatory prefix and reconnect is an existing function name
const socketPlugin = createSocketIoPlugin(socket, {defaultFunctions: ['socketReconnect']);Set up channel name formatter
You can provide your own channel converter function:
const socketPlugin = createSocketIoPlugin(socket, {converter: _.camelCase});The default channel name will be in UPPER_SNAKE_CASE
Namespaces for store modules and for socket instances are supported.
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default new Vuex.Store({
state: {
connect: false,
message: null
},
mutations:{
socketOnConnect: (state, status ) => {
state.connect = true;
},
socketOnDisconnect: (state, status ) => {
state.connect = false;
},
socketOnMessage: (state, message) => {
state.message = message;
}
},
actions: {
socketConnect: () => {},
socketEmitMessage: () => {},
socketOnOtherMessage: (context, message) => {
...some code here
},
},
plugins: [socketPlugin]
})Socket instance with namespace:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default new Vuex.Store({
state: {
connect: false,
message: null
},
mutations:{
namespaceSocketOnConnect: (state, status ) => {
state.connect = true;
},
namespaceSocketOnDisconnect: (state, status ) => {
state.connect = false;
},
namespaceSocketOnMessage: (state, message) => {
state.message = message;
}
},
actions: {
namespaceSocketConnect: () => {},
namespaceSocketEmitMessage: () => {},
namespaceSocketOnOtherMessage: (context, message) => {
...some code here
},
},
plugins: [socketPlugin]
})Notes
No support for dynamic registred store modules. Plugin emits first to the socket channel and then it calls related Vuex store action.