vue-socket.io踩坑实录
背景
最近在研究实时通讯,需要上vue+socket.io,网上有大佬出了一个叫vue-socket.io的插件。
实录1
组件内监听
sockets: {
connect() {
console.log('连接')
}
},
程序结果是输出“连接”,但多次刷新发现,偶尔会出现不输出的情况。
经过调试发现,其实socket连接是异步的。不输出的情况恰是因为连接socket比vue加载组件的速度快,提前触发了connect事件。
这种情况如何调试调试
很简单,我们模拟写一个vue插件。
index.js
import SocketIO from "socket.io-client";
import config from '@/config'
import Mixin from "./mixin";
export default {
install(Vue) {
const socket = SocketIO(config.websocket, {
transports: ['websocket'],
});
socket.on('connect', () => {
console.log('插件内 连接')
})
Vue.prototype.$socket = socket;
Vue.mixin(Mixin);
}
};
mixin.js
export default {
beforeCreate() {
if (!this.sockets) this.sockets = {};
},
mounted() {
if (this.$options.sockets) {
Object.keys(this.$options.sockets).forEach(event => {
this.$socket.on(event, this.$options.sockets[event])
});
}
}
}
index.vue
export default {
// ...自己的业务代码
sockets: {
connect() {
console.log('连接')
}
},
}
刷新看控制台会发现,'插件内 连接'
的输出一直都有,而'连接'
的却时有时无。
如何解决这个问题
不要用vue-socket.io,自建插件参考index.js,把有关初始化的事件都做到插件里。其他业务逻辑写入组件即可。
按道理使用vue-socket.io中的.io
属性是可以的,但测试后发现也是有问题的。具体原因不得而知。
import VueSocketIO from 'vue-socket.io'
const socket = new VueSocketIO({
connection: 'ws://192.168.1.***:9501',
options: {
transports: ['websocket'],
}
});
socket.io.on('connect', () => {
console.log('连接')
})
总结
不能依赖vue-socket.io
插件,需要自己写一个简单的插件去封装。而且必要的全局性、初始化类的事件要在插件内实现,因为插件内只会被挂载一次。
vue-socket.io踩坑实录
http://blog.icy8.cn/posts/52507/