passToStore(event, payload){
// 如果事件不是以SOCKET_开头的就不用管了
if(!event.startsWith('SOCKET_')) return // 这里遍历vuex的store中的mutations
for(let namespaced in this.store._mutations) {
// 下面的操作是因为,如果store中有module是开了namespaced的,会在mutation的名字前加上 xxx/
// 这里将mutation的名字拿出来
let mutation = namespaced.split('/').pop()
// 如果名字和事件是全等的,那就发起一个commit去执行这个mutation
// 也因此,mutation的名字一定得是 SOCKET_开头的了
if(mutation === event.toUpperCase()) this.store.commit(namespaced, payload)
}
// 这里类似上面
for(let namespaced in this.store._actions) {
let action = namespaced.split('/').pop()
// 这里强制要求了action的名字要以 socket_ 开头
if(!action.startsWith('socket_')) continue
// 这里就是将事件转成驼峰式
let camelcased = 'socket_'+event
.replace('SOCKET_', '')
.replace(/^([A-Z])|[Ws_]+(w)/g, (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase())
// 如果action和事件全等,那就发起这个action
if(action === camelcased) this.store.dispatch(namespaced, payload)
}
}
passToStore嘛其实就是做两个事情,一个是获取与该事件对应的mutation,然后发起一个commit,一个是获取与该事件对应的action,然后dispatch。只是这里的实现对mutations和actions的命名有了要求,比如mutations的命名一定得是SOCKET_开头,action就是一个得socket_开头,然后还得是驼峰式命名。
最后
首先,这个源码是不是略有点简单,哈哈哈,不过,能给你们一些帮助,我觉得也挺好的
然后,就是如果上面我说的有是很对的,请大家去这里发issue或者直接评论吧
最后,源码的详细的注释在这里










