uniapp:小白1分钟学会使用webSocket(可无脑复制)

uni.connectSocket()
uni.$emit页面通信

项目中使用uni.connectSocket()创建webSocket的总结,代码可无脑复制,直接使用。

1、main.js 引入vuex

js 复制代码
import store from './store';
Vue.prototype.$store = store;

vuex中封装webSocket

2、vuex的:index.js

js 复制代码
import Vue from 'vue';
import Vuex	from 'vuex';
// 模块
import chat from './modules/chat';
Vue.use(Vuex);
const store = new Vuex.Store({
	modules: {
		chat,
	}
});
export default store;

3、vuex的chat

js 复制代码
import Vue from 'vue';
export default {
	namespaced: true,
	state: {
		socketUrl:'wss://api.****.com/wss/default.io', // socke链接
		isclose: false, // 是否已连接
		reconnections: 0, // 连接次数
		heartbeatInterval: null, // 心跳检测
	},
	mutations: {
	},
	actions: {
		// 开始或重启即时通讯,全局监听
		async start({state, dispatch, rootState}){
			// 如果已连接,关闭重新连接
			uni.onSocketOpen(()=> {
				state.isclose = true;
			});
			if (state.isclose) {
				uni.closeSocket();
				uni.onSocketClose((res)=> {
					clearInterval(state.heartbeatInterval)
					state.heartbeatInterval = null
					console.log('已经连接中的Socket关闭成功')
				});
			}
			// 获取token省略,自行请求接口并赋值,这里只是快速演示如何:创建一个 WebSocket 连接
			let token = 'eyJ0****c1Ng'
			if(token){
				let url = `${state.socketUrl}?token=${token}`
				uni.connectSocket({url});
			}else{
				console.log('未获取到token');
			}
			
			// 监听 WebSocket 连接打开事件
			uni.onSocketOpen((res)=> {
				console.log('新创建的Socket连接成功');
			});
			
			// 监听WebSocket错误。
			uni.onSocketError((res)=> {
				state.reconnections += 1;
				if (state.reconnections <= 3) {
					console.log(`连接失败,正在尝试第${state.reconnections}次连接`);
					dispatch('start');
				}else{
					console.error('已尝试3次重新连接均未成功');
				}
			});
			
			// 监听socket接受到服务器的消息事件
			uni.onSocketMessage((res)=> {
				let getData = JSON.parse(res.data)
				if(getData.event == 'connect'){
					// 心跳
					state.heartbeatInterval = setInterval(()=>{
						uni.sendSocketMessage({data: '{"event":"heartbeat"}'});
					},5000)
				}
				
				// 通过uni.$emit触发全局的自定义事件,并在页面中通过uni.$on接收数据
				if(getData.event == 'event_talk'){
					uni.$emit('getMsg',getData.content); // 更新消息内容
					uni.$emit('getList',getData.content); // 更新消息列表
				}
			});
		}
	}
}

4、login:登录页面

js 复制代码
// 登录接口,登录成功后,存储token,执行chat/start
this.$http.post('/api/').then(res=>{
	// 存储token
	uni.setStorageSync('token', res.token);
	this.$store.dispatch('chat/start');
})

5、聊天页面

js 复制代码
<script>
	export default {
		data() {
			return {

			}
		},
		onUnload() {
			// 卸载监听
			uni.$off('getMsg')
			uni.$off('getList')
		},
		onLoad() {
			// 收到更新消息
			uni.$on('getMsg', data => {
				console.log('收到消息的监听getMsg:',data);
			})
			// 收到更新列表
			uni.$on('getList', data => {
				console.log('收到消息的监听getList:',data);
			})
		},
	}
</script>
相关推荐
zhifou1234568 小时前
Vue基础(二)
前端·javascript·vue.js
宠友信息9 小时前
内容社区源码开发实践解析,用Spring Boot打造1:1仿小红书源码平台
java·spring boot·redis·websocket·mysql·spring·uni-app
你脑门上的脚印10 小时前
Vue 项目从零实现语音转文字、文字转语音功能(完整可用 + 踩坑指南)
前端·vue.js
梦曦i11 小时前
Vue-Router 2.4.0 新增可控重定向功能
前端·uni-app
郑州光合科技余经理12 小时前
海外版外卖系统架构:订单怎么流转、权限怎么分
java·开发语言·前端·系统架构·uni-app·php·ai编程
lemon_yyds12 小时前
H5 页面嵌入 APP 的 web-view 时-调用原生能力(uniapp)
vue.js
ITmaster073113 小时前
Vibe Coding 时代:Vue 消失了还是 React 太强?
前端·vue.js·react.js
万敏14 小时前
Vue3 全栈实战第七周:错误处理与请求层封装实战记录
vue.js·node.js·全栈
请你吃div15 小时前
Electron 从零开始的新手开发教程
vue.js·windows·electron
qq_3168377516 小时前
uniapp 安卓/H5 使用 contentEditable 属性 富文本编辑器
android·javascript·uni-app