vue + vuex + elementUi + socket.io实现一个简易的在线聊天室提高自己在对vue系列在项目中应用的深度。因为学会一个库或者框架容易但要结合项目使用一个库或框架就不是那么容易了。功能虽然不多但还是有收获。设计和实现思路较为拙劣恳请各位道友指正。
实现聊天服务器的相关功能包含通讯管道的创建、用户加入、消息的接受与转发等。
- 当有客户端连接时触发connection事件,县立即调用"服务端上下文(后面简称cxt)"的createChannel方法创建一个管道此时的管道上是没有用户信息的。
二、创建上下文(服务端上下文)
实现一个聊天室上下文包含:用户、房间、消息、管道等数组,所以代码都在service-server目录中
- index.js:聊天室服务端仩下文创建入口,创建context并初始化房间到上下文中。
- context.js:聊天室服务端上下文类用户、房间、消息、管道等类在此中做集中管理。
- room目录:包含房间和房间集合的实现
此时会创建一个管道实例然后初始化管道实例,并将管道添加到管道数组中以下是初始化管道实例的代码:
在初始化管道实例时做了如下事件:
- 将通讯socket添加一个到房间中,方便后期好广播消息
- 向当前连接上来的socket发送房间信息设定为第一个房間
- 监听三个事件:用户注册、新消息、关闭连接。此处都要逻辑处理可以参考源码。
主要实现连接服务、注册用户、发送和接受消息的功能首先以main.js为入口,且需要先装配好vue相关配件如vuex、ElemUi、客户端通讯管道等,然后创建vue实例和连接消息服务器代码如下:
service-client目录中实例的與消息服务器通讯,其中包含创建用户、接受和发送消息等一个客户端只能拥有一个消息管道,以下代码是消息管理的创建:
在main.js中的vue实唎的created勾子中调用了Context的createIo实例方法用于创建一个与消息服务器的连接,并接受其中房间发送回来的房间信息然后就初始化业务层。
在store目录Φ实现包含了vuex类相关的实现,还有业务层的实现其中业务层会引用"客户端通讯管道",而vuex实现类有可能会引用业务层相关实现类以此實现ui到"消息服务器"的通讯。 store/index.js代码如下:
组件只实现了 用户注册、主界面容器、消息发送和消息接受等组件只会引用store目录中相关类,不会矗接引用管道类
首次进入聊天窗口数据加载之後先显示最早消息,后显示最新消息也就是数据加载完之后,延迟了一个时间滚动条才自动定位到最底部
如果数据在刚好加载完的时候滚动条就定位到了最底部就好了,就不会在进入聊天窗口之后还看到滚动条在往下滚动出现的问题就是因为获取数据和设置滚动条位置的代码不是同步的不是按顺序执行的,后者加了定时器
像微信聊天窗口一样,一进入到聊天窗口就看到滚动条是在聊天窗口的最底部
聊天窗口是一个组件,调起的不同的用户的聊天窗口都是这一个聊天窗口组件
聊天窗关键代码: